【问题标题】:How to use Nsubstitue for method with different arguments and return values?如何将 Nsubstitue 用于具有不同参数和返回值的方法?
【发布时间】:2019-09-17 20:06:08
【问题描述】:

对于单元测试,我使用NSubstitue 来存根我的存储库方法(比如IRepo.GetOrder(orderId))我可以为一个特定的参数存根,例如:

IRepo RepoSub = Substitute.For<IRepo>();
Order ord = new Order{/*...*/}
RepoSub.GetOrder(Arg.Is<int>(123)).ReturnsForAnyArgs(ord);

但是,我正在测试的 BL 方法使用 Repository 来处理数组中的多个订单 ID,这些订单 ID 作为 i/p 参数传递给该 BL 方法 (int[] orderIds)。我不确定如何在RepoSub GetOrder 中使用NSubstitue 来处理不同的参数。我尝试在 Nsubstitue 文档中弄清楚,但没有运气。

任何帮助表示赞赏。谢谢!!

【问题讨论】:

    标签: c# unit-testing mocking nsubstitute


    【解决方案1】:

    为了改变Order 返回值,您必须配置存根/模拟为每个单独的orderId 值返回一个众所周知的Order 实例。

    var order1 = new Order { Id = 1 };
    var order2 = new Order { Id = 2 };
    var order3 = new Order { Id = 3 };
    IRepo repoSub = Substitute.For<IRepo>();
    
    repoSub.GetOrder(1).Returns(order1);
    repoSub.GetOrder(2).Returns(order2);
    repoSub.GetOrder(3).Returns(order3);
    
    var o3 = repoSub.GetOrder(3); // order3
    var o2 = repoSub.GetOrder(2); // order2
    var o1 = repoSub.GetOrder(1); // order1
    

    【讨论】:

    • 我怀疑这将有助于实际测试场景。有了这个,我最终可能会为所有按顺序传递的 I/p 返回相同的顺序,不是吗?
    • 确实,这个问题我并不清楚。
    • 我更新了我的答案以改变返回的Order 实例。
    • 好的。谢谢!!所以当调用 GetOrder 时说 OrderId 1 它将返回哪个订单?
    • 谢谢,成功了。实际上,我在原来的帖子中又犯了一个错误。而不是使用Return(..) 我使用的是ReturnsForAnyArgs(..)
    猜你喜欢
    • 1970-01-01
    • 2012-08-05
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多