如何.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);
最佳答案
每当替代者收到调用时,它会记录有关调用的信息,并更新一些全局状态(线程本地,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/