簡體   English   中英

用 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);
    }

因為模擬會立即返回,所以實際上並沒有等待調用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM