我有以下接口(interface):
interface IManufacturing
{
IJobApi JobApi {get;}
}
interface IJobApi
{
IList<JobSpec> GetSpecs (string wo, string name);
}
我有一个使用 IManufacturing 并调用 GetSpecs() 的类,如下所示:
var specs = _manufacturing.JobApi.GetSpecs (wo, name);
我设置我的模拟如下:
var jobApi = A.Fake<IJobApi> ();
A.CallTo (() => jobApi.GetSpecs (It.IsAny<string> (), It.IsAny<string> ()))
.Invokes (() => System.Diagnostics.Trace.WriteLine("GetSpecs called!"))
.Returns (new List<JobSpec>
{
new JobSpec("blablabla", "0.125", "something")
});
var manufacturing = A.Fake<IManufacturing> ();
A.CallTo (() => manufacturing.JobAPI)
.Invokes (() => System.Diagnostics.Trace.WriteLine ("JobAPI called!"))
.Returns (jobApi);
运行测试后,我只在输出中看到“JobAPI called”字符串。 因此,GetSpecs() 不会被 mock ,并且调用者确实会抛出异常,因为它期望一个规范列表,而它收到一个空字符串......
这里的罪魁祸首是什么?
谢谢。
最佳答案
可恶!
你会笑的,我笑了!
结果是下面一行
A.CallTo (() => jobApi.GetSpecs (It.IsAny<string> (), It.IsAny<string> ()))
对于 FakeItEasy 来说不正确。应该写成
A.CallTo (() => jobApi.GetSpecs (A<string>.Ignored, A<string>.Ignored))
所以,您可能想知道为什么它能够编译并运行......是的,我也是。 ;)
It.IsAny 适用于起订量 (!)
我的“使用起订量”在类(class)中名列前茅。 (我正在从最小起订量切换到 fakeiteasy)。
[脸掌]
TGIF
关于c# - 如何模拟从另一个模拟作为属性返回的接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11475774/