[英]Mocking external responses with NSubstitute
我有一個方法可以調用各種服務並稍后使用它們的輸出。 像這樣的東西:
myOutput1 = await _apiCaller.Call(() => _myService.someCall(someData));
myOutput2 = await _apiCaller.Call(() => _myService.anotherCall(otherData));
我只想用 NSubstitute 來模擬對這些的回應,而無需等待電話。
但是,它看起來不像 NSubstitute 捕獲內部函數調用(例如someCall
、 anotherCall
),所以我必須模擬 API 調用者。 這是兩個方面的問題:我似乎無法區分兩個函數輸入,更廣泛地說,甚至無法正確模擬調用者。
我正在做以下事情:
sub._apiCaller.Call(default).ReturnsForAnyArgs(Task.FromResult(myMockData));
但仍然在myOutput#
得到null
結果。
模擬此類調用結果的正確方法是什么,有沒有辦法區分內部函數調用?
這與您的建議有些相似。 就您如何模擬內部服務而言,這個想法將是相同的。
[TestClass]
public class UnitTest1
{
private IMyService _myService;
private ApiCaller _apiCaller;
[TestInitialize]
public void Initialize()
{
_apiCaller = new ApiCaller();
_myService = Substitute.For<IMyService>();
}
[TestMethod]
public async Task TestMethod1()
{
_myService.SomeCall(Arg.Any<int>()).Returns(190);
var output = await _apiCaller.Call(() => _myService.SomeCall(4));
Assert.AreEqual(190, output);
}
}
public class ApiCaller
{
public async Task<T> Call<T>(Func<T> service)
{
return await Task.Run(() => service.Invoke());
}
}
public class MyService : IMyService
{
public int SomeCall(int x)
{
return x * 8;
}
}
public interface IMyService
{
int SomeCall(int x);
}
因為模擬會立即返回,所以實際上並沒有等待調用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.