2017-08-30 94 views
0

我需要模擬我的IVehicleRecordsRepository進行一些測試。因此,這裏的回購接口:使用ReturnsAsync進行設置,需要返回值的傳遞,但得到空值

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

我沒有用過Moq,所以請原諒我的無知。
在你的行爲聲明:

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

你只是路過的車輛記錄(「VR」),但你的嘲笑對象設置上也期望Guid.NewGuid(),對不對?

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,因爲你傳遞只在VehicleRecord:

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

另外,作爲Moq的人指出我可以設置它像這樣(可空): ''' mockRepo .Setup(回購=> repo.StoreAsync(It.IsAny (),It.IsAny ())) .ReturnsAsync((VehicleRecord veh,Guid uid)=> veh) ''' – alvipeo