.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/