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调用程序。实例化它解决了这个问题。不过,您的示例仍然很有用,谢谢!