使用 NSubstitute 模拟外部响应

Mocking external responses with NSubstitute

我有一个调用各种服务并稍后使用它们的输出的方法。像这样:

myOutput1 = await _apiCaller.Call(() => _myService.someCall(someData));
myOutput2 = await _apiCaller.Call(() => _myService.anotherCall(otherData));

我只想用 NSubstitute 模拟对这些的响应,而不用等待调用。

但是,NSubstitute 似乎没有捕捉到内部函数调用(例如 someCallanotherCall),所以我必须模拟 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);
    }

因为模拟正在立即返回,所以实际上并没有等待调用。