cod*_*452 4 c# mocking nsubstitute
.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);
Run Code Online (Sandbox Code Playgroud)
每当替代者接收到一个呼叫时,它就会记录有关呼叫的信息,并更新一些全局状态(threadlocal,正如斯科特指出的那样),记录它是最近被称为的替代品.
当.Returns运行时,它查找最后一个被调用的替换,然后告诉替换,它的最后一个调用应该被存根以返回该特定值.(它也会将它从接收到的呼叫集合中删除,因此如果我们运行.Received()存根呼叫,则不会对真实呼叫感到困惑.)
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.
Run Code Online (Sandbox Code Playgroud)
我认为这是发生的事情的合理近似值.为了增加一点精度以防你想要查看代码,替代品是一个动态代理,它将每个调用转发到一个" 调用路由器 ",它处理所有替代逻辑(存储调用,配置调用,添加回调等) ).全局状态是a SubstitutionContext,它存储接收呼叫的最后一个呼叫路由器.
(回购链接是v4.0.0-rc1标记.后来的版本可能会改变,但整体想法应保持相当一致.)
| 归档时间: |
|
| 查看次数: |
1322 次 |
| 最近记录: |