我需要模拟我的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
答案 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>()))