FakeItEasy - 新修饰符的问题

时间:2015-09-04 20:03:38

标签: c# mocking fakeiteasy

以下代码似乎没有像我期望的那样行事:

using FakeItEasy;
using Microsoft.VisualStudio.TestTools.UnitTesting;

[TestClass]
public class UnitTest1
{
    [TestMethod]
    public void TestMethod1()
    {
        var derived = A.Fake<IDerived>();
        A.CallTo(() => derived.Dependency).Returns(null);

        IBase baseObj = derived;
        Assert.IsNull(baseObj.Dependency); //Fails
    }
}

public interface IDerived : IBase
{
    new IDependency Dependency { get; }
}

public interface IBase
{
    IDependency Dependency { get; }
}

public interface IDependency
{
}

而不是返回null,假设它很容易返回IDependency的假实例。也许是按设计?无论如何,我如何解决这个问题并确保baseObj.Dependency返回已配置的内容?

1 个答案:

答案 0 :(得分:4)

这是正常行为。 IDerived现在有两个成员。一个继承自IBase,另一个在IDerived中定义。

在您的测试方法中,您正在使用FakeItEasy设置IDerived中的值。

IBase的成员没有设置。所以它得到了FakeItEasy给出的默认值,这是一个模拟的IDependency。

如果要设置它,请使用以下代码:

IDerived derived = A.Fake<IDerived>();

IBase baseObj = derived;

A.CallTo(() => baseObj.Dependency).Returns(null);

Assert.IsNull(baseObj.Dependency); //No error here

在这段代码中,我们设置了IDerived的另一个成员,它是基接口中定义的依赖项。