.Returns<T> (this T value, ... ) 扩展方法在底层是如何工作的?

具体来说,.Returns 如何仅从执行该方法的结果中知道它打算配置什么方法?

例子:

public interface ICalculator { Add(int a, int b); }

// create mock
var calculator = Substitute.For<ICalculator>();

// How does this piece work under the hood?
calculator.Add(1, 2).Returns(3);

最佳答案

每当替代者收到调用时,它会记录有关调用的信息,并更新一些全局状态(threadlocal,as Scott pointed out),记录它是最近调用的替代者。

.Returns 运行时,它会查找最后一个调用的替代,然后告诉替代它的最后一个调用应该被 stub 以返回该特定值。 (它还从接收到的调用集合中删除它,所以如果我们运行 .Received() stub 调用不会与真正的调用混淆。)

calculator
    .Add(1, 2)   // substitute records Add(1,2) called. Last substitute
                 // set to `calculator`. Returns default `int` in this case.
    .Returns(3)  // Looks up last sub, sets its last call to return 3.

我认为这是对所发生情况的合理近似。为了增加一点精度,以防你想查看代码,替代品是 dynamic proxy forwards 每次调用“call router ”处理替代品的所有逻辑(存储调用,配置调用,添加回调等) .全局状态是 SubstitutionContext ,它存储接收到调用的最后一个调用路由器。

(repo 链接到 v4.0.0-rc1 标签。以后的版本可能会改变,但总体思路应该保持相当一致。)

关于c# - NSubstitute .Returns<T>() 如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39410333/

10-11 04:09