c# - 如何模拟从另一个模拟作为属性返回的接口(interface)?

标签 c# mocking fakeiteasy

我有以下接口(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/

相关文章:

android - 作为 UI 测试的一部分在 Application 类中进行的模拟 API 调用

interface - 使用 fakeiteasy 的假(接口(interface)与抽象类)行为不一致

FakeItEasy 设置属性没有 get 访问器?

c# - 有没有一种方法可以在不使用 C# 中的 SMO 的情况下在 MYSQL 中创建数据库

c# - C# : using -= operator by events? 是什么意思

c# - 具有派生类型的 XML 序列化

vb.net - 使用 Rhino Mocks 在 VB.NET 中设置对 Sub(非函数)的期望

c# - 从 JQuery 调用的 ASP.Net [WebMethod] 获取更好的错误消息

java - 如何模拟DriverManager.getConnection?

c# - 如何在 FakeItEasy 中为基于自定义委托(delegate)的事件引发事件?