【问题标题】:NSubstitute When...Do definition is not getting overriden by subsequent definitionsNSubstitute When...Do 定义不会被后续定义覆盖
【发布时间】:2013-01-11 07:16:23
【问题描述】:
void ABC()
{
    var foo = Substitute.For<IFoo>();
    foo.When(x => x.Bar()).Do(x => counter++);
    <use Bar()>.... 1
    foo.When(x => x.Bar()).Do(x => counter--);
    <use Bar()>.... 2
}

对于上面的代码 sn-p (1) 和 (2) 都显示 counter++ 行为,表明 When...Do 行为没有被覆盖。我需要这种行为来生成我想要连接不同回调的测试场景。

我应该如何做到这一点?

【问题讨论】:

    标签: c# unit-testing c#-4.0 nsubstitute


    【解决方案1】:

    Do 回调不会被替换,但两者都应该执行。例如(使用 NSub 1.4.3.0):

    var counter = 0;
    var sub = Substitute.For<IFoo>();
    sub.When(x => x.Bar()).Do(x => counter++);
    sub.Bar();
    Console.WriteLine(counter);  // prints 1
    sub.When(x => x.Bar()).Do(x => counter--);
    sub.Bar();
    Console.WriteLine(counter);  // prints 1, as counter gets inc'd to 2, then dec'd to 1
    

    我建议谨慎使用 When..Do,因为它的使用可能是封装失败的症状。将行为强制到替换对象中可能表明我们正在测试的类与依赖类的行为有深度耦合,而不是我们要替换的接口。

    使用该免责声明,您可以换出回调的一种方法是使用辅助类来提供特定的回调:

    [Test]
    public void Example() {
        var counter = 0;
        var helper = new CallbackHelper();
        helper.Callback = x => counter++;
        var sub = Substitute.For<IFoo>();
    
        sub.When(x => x.Bar()).Do(x => helper.Callback(x));
        sub.Bar();
        Console.WriteLine(counter);
    
        helper.Callback = x => counter--;
        sub.Bar();
        Console.WriteLine(counter);
    
        helper.Callback = x => { counter = (counter+1) * 10; };
        sub.Bar();
        Console.WriteLine(counter);
    }
    
    public class CallbackHelper {
        public Action<CallInfo> Callback;
    }
    
    /* Prints:
        1
        0
        10
    */
    

    如果您发布您想要实现的行为交换的具体示例,我们可能会提出一个界面更改来完全避免使用它。

    希望这会有所帮助。 :)

    【讨论】:

    • 非常感谢您的回复。我自己想出了耦合的东西并修复了它。但我真的很高兴看到我的决定得到验证。并感谢分享这样做的方法。虽然正如你所建议的那样,我会尽量避免这种情况。
    猜你喜欢
    • 2018-10-18
    • 2019-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-19
    • 1970-01-01
    • 2018-03-24
    • 2023-03-07
    相关资源
    最近更新 更多