问题描述
我有一种方法可以调用各种服务,并在以后使用它们的输出。像这样:
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));
但仍然在null
中得到myOutput#
的结果。
模拟此类调用结果的正确方法是什么,有没有办法区分内部函数调用?
解决方法
这与您的建议有些相似。关于如何模拟内部服务的想法将是相同的。
[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);
}
由于模拟立即返回,因此实际上并未等待呼叫。