模拟框架不抛出异常的原因是什么

时间:2016-04-09 02:20:00

标签: c# unit-testing mocking stub fakeiteasy

在下面的示例中,即使尚未定义0成员IThing,FakeItEasy也会返回GetValue()。我的问题是;为什么从未定义的成员调用返回0的值而不是抛出的异常;是否有一些通用的模拟/伪造/存根框架软件模式,规定抛出异常调用未定义的成员是不是没有?

public interface IThing
{
    int GetValue();
}

public class Thing: IThing
{
    public int GetValue()
    {
        return 1000;
    }
}

    [TestMethod]
    public void Test1()
    {
        var thing= A.Fake<IThing>();
        // A.CallTo(() => thing.GetValue()).Returns(1);
        var val = thing.GetValue(); // Not defined but returns 0 rather than throwing an exeption
        Assert.AreEqual(1, val);
    }

1 个答案:

答案 0 :(得分:2)

这主要是基于意见的问题,可能会被关闭。但是,这里有一些信息。 首先,默认情况下,某些框架是严格的,有些框架允许更宽松的语义。 FakeItEasy倾向于后者。给出这种选择的原因通常是这样的样式支持不那么脆弱的测试 - 因为当“不重要”的事情改变时,用户不必定义与假对象(或模拟,或任何你想要调用它)的每次交互。 ,你的测试不会“无缘无故”破解。

有些人喜欢严格的语义,有些则不喜欢。

请注意,如果您想要严格行为,可以使用strict fakes

在FakeItEasy中获取
var thing= A.Fake<IThing>(options => options.Strict());

FakeItEasy 2.0.0-rc1中,您可以使用implicit creation options全局启用此行为,方法是实现以下选项构建器:

class MakeEverythingStrictOptionsBuilder : IFakeOptionsBuilder
{
    public bool CanBuildOptionsForFakeOfType(Type type)
    {
        return true;
    }

    public void BuildOptions(Type typeOfFake, IFakeOptions options)
    {
        options.Strict();
    }

    public Priority Priority
    {
        get { return Priority.Default; }
    }
}