【问题标题】:How to mock an interface returned as property from another mock?如何模拟从另一个模拟返回的接口作为属性?
【发布时间】:2026-01-04 12:00:02
【问题描述】:

我有以下接口:

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() 不会被嘲笑,并且调用者确实会抛出,因为它期望一个规范列表,而它收到一个空字符串......

这里的罪魁祸首可能是什么?

谢谢。

【问题讨论】:

    标签: c# mocking fakeiteasy


    【解决方案1】:

    该死的!

    你会笑的,我笑了!

    原来是下面这行

    A.CallTo (() => jobApi.GetSpecs (It.IsAny<string> (), It.IsAny<string> ()))
    

    对于 FakeItEasy 不正确。应该写成

    A.CallTo (() => jobApi.GetSpecs (A<string>.Ignored, A<string>.Ignored))
    

    所以,您可能想知道为什么它会编译并运行……是的,我也是。 ;)

    It.IsAny 适用于最小起订量 (!)

    我有一个使用起订量在班级顶部徘徊的问题。 (我正在从 moq 切换到 fakeiteasy)。

    [掌心]

    TGIF

    【讨论】:

    • 诚实+1。我认为人们仍然可以从这样的事情中学习。
    最近更新 更多