【问题标题】:What is the reason for mocking frameworks not throwing exceptions模拟框架不抛出异常的原因是什么
【发布时间】:2016-04-09 02:20:00
【问题描述】:

在下面的示例中,即使 IThing 成员 GetValue() 尚未定义,FakeItEasy 也会返回 0。我的问题是;为什么从未定义的成员调用返回值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);
    }

【问题讨论】:

  • 您在var thing= A.Fake&lt;IThing&gt;(); 行中定义了您的假货,这将创建一个假的 IThing 对象(一个假的 IThing 对象,而不是一个 Thing 对象)。 0 将只是 int 的默认值(因为您没有指定它返回任何其他值)。我不确定一般的异常行为,但在这种情况下它不会抛出,因为一切都是有效的。
  • @Tone 这不是我要问的。运行时异常是在 .NET 运行时调用未定义成员时的预期行为,因为它是强类型的,我的问题是为什么 Mocking 框架具有更宽松的语义。

标签: c# unit-testing mocking stub fakeiteasy


【解决方案1】:

这主要是一个基于意见的问题,可能会被关闭。但是,这里有一些信息。 首先,有些框架默认是严格的,有些则允许较宽松的语义。 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; }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-20
    相关资源
    最近更新 更多