使用 NSubstitute 模拟外部响应
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);
}
因为模拟正在立即返回,所以实际上并没有等待调用。
我有一个调用各种服务并稍后使用它们的输出的方法。像这样:
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);
}
因为模拟正在立即返回,所以实际上并没有等待调用。