使用ReturnsAsync进行设置,需要返回传入的值但是返回null

时间:2017-08-30 00:40:34

标签: c# testing moq

我需要模拟我的IVehicleRecordsRepository进行一些测试。所以这里是repo界面:

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 个答案:

答案 0 :(得分:1)

我没有使用过Moq,所以请原谅我的无知 在你的行为声明中:

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

你只是传递了车辆记录(&#39; vr&#39;),但你的模拟对象设置为也期望Guid.NewGuid(),对吗?

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

可能是它与期望不匹配因此,从不调用&#34;(mockObject。)ReturnsAsync&#34;方法

你有没有尝试过这样的事情:

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

或者,也许稍微简化它,将你的mockObject更改为不期望Guid,因为你只传入了VehicleRecord:

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