代码之家  ›  专栏  ›  技术社区  ›  AlexB

带有ReturnsAsync的安装程序,需要返回传入的值,但返回null

  •  1
  • AlexB  · 技术社区  · 7 年前

    IVehicleRecordsRepository 对于一些测试。这是回购的界面:

    public interface IVehicleRecordsRepository
    {
        Task<VehicleRecord> StoreAsync(VehicleRecord veh, Guid? userId = null);
        //...
    }
    

    现在我试着在xUnit测试中模拟它 StoreMethod()

    [Fact]
    public async Task ShouldGetValueFromMockedMethod()
    {
        var mockRepo = new Mock<IVehicleRecordsRepository>();
        mockRepo
            .Setup(repo => repo.StoreAsync(It.IsAny<VehicleRecord>(), Guid.NewGuid()))
            .ReturnsAsync((VehicleRecord veh, Guid userId) => veh)
            // tried this too -> .Returns((VehicleRecord veh, Guid userId) => Task.FromResult(veh))
            ;
    
        VehicleRecord vr = new VehicleRecord(newVehicle, Guid.NewGuid());
        var testVeh = await mockRepo.Object.StoreAsync(vr);
        Assert.NotNull(testVeh); // ====> FAILS HERE
        Assert.AreEqual(vr, testVeh);
    }
    

    StoreAsync() 作为回报

    Moq版本:4.7.99.0

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gregg L    7 年前

    我没有用过Moq,所以请原谅我的无知。
    在您的act声明中:

    var testVeh = await mockRepo.Object.StoreAsync(vr);
    

    mockRepo.Setup(repo => repo.StoreAsync(It.IsAny<VehicleRecord>(), Guid.NewGuid()))
    

    可能是因为它与预期不匹配,因此从不调用“(mockObject。)ReturnsAsync“方法?

    var guid = Guid.NewGuid;
    VehicleRecord vr = new VehicleRecord(newVehicle, guid);
    var testVeh = await mockRepo.Object.StoreAsync(vr, guid);
    

    或者,也许可以稍微简化一下,将mockObject更改为不需要Guid,因为您只传递VehiclerRecord:

    mockRepo.Setup(repo => repo.StoreAsync(It.IsAny<VehicleRecord>()))