微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

用NSubstitute模拟外部响应

如何解决用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));

但仍然在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);
    }

由于模拟立即返回,因此实际上并未等待呼叫。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。