C# 用NSubstitute模拟外部响应
我有一个方法可以调用各种服务并在以后使用它们的输出。大概是这样的:C# 用NSubstitute模拟外部响应,c#,nunit,nsubstitute,C#,Nunit,Nsubstitute,我有一个方法可以调用各种服务并在以后使用它们的输出。大概是这样的: myOutput1 = await _apiCaller.Call(() => _myService.someCall(someData)); myOutput2 = await _apiCaller.Call(() => _myService.anotherCall(otherData)); 我只想用NSubstitute来模拟这些响应,而不必等待调用 但是,它看起来不像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);
}
[TestClass]
公共类UnitTest1
{
私人IMyService(u myService);;
私人APICALLERu ApiCaller;
[测试初始化]
公共无效初始化()
{
_apiCaller=新的apiCaller();
_myService=Substitute.For();
}
[测试方法]
公共异步任务TestMethod1()
{
_SomeCall(Arg.Any()).Returns(190);
var output=wait_apiCaller.Call(()=>_myService.SomeCall(4));
AreEqual(190,输出);
}
}
公共类ApiCaller
{
公共异步任务调用(Func服务)
{
返回wait Task.Run(()=>service.Invoke());
}
}
公共类MyService:IMyService
{
公共int-SomeCall(intx)
{
返回x*8;
}
}
公共接口IMyService
{
intsomecall(intx);
}
由于模拟将立即返回,因此实际上没有等待调用。您应该能够模拟对服务的调用。您没有显示与查看特定案例相关的代码片段,我假设正在测试的实例是_apiCaller。我和NSubstitute做过很多类似的事情。有些你没有表现出来的东西正在妨碍你。请添加与测试相关的其余代码。您是正确的,我复制了一些代码,但没有注意到我正在替换API调用程序。实例化它解决了这个问题。不过,您的示例仍然很有用,谢谢!