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

C# 模拟框架不抛出异常的原因是什么,c#,unit-testing,mocking,stub,fakeiteasy,C#,Unit Testing,Mocking,Stub,Fakeiteasy,在下面的示例中,fakeitesy返回0,即使IThing成员GetValue()尚未定义。我的问题是,;为什么从未定义的成员调用返回值0,而不是引发异常;是否存在一些通用的模拟/伪造/存根框架软件模式,规定为调用未定义的成员而抛出异常是不允许的 public interface IThing { int GetValue(); } public class Thing: IThing { public int GetValue() { return 1

在下面的示例中,fakeitesy返回
0
,即使
IThing
成员
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);
    }
public接口信息
{
int GetValue();
}
公共类的东西:我喜欢
{
public int GetValue()
{
返回1000;
}
}
[测试方法]
公共void Test1()
{
var thing=A.Fake();
//A.CallTo(()=>thing.GetValue()).Returns(1);
var val=thing.GetValue();//未定义,但返回0而不是抛出一个exeption
断言.AreEqual(1,val);
}

这主要是一个基于意见的问题,可能会被关闭。然而,这里有一些信息。 首先,一些框架在默认情况下是严格的,而一些框架允许更松散的语义。假货倾向于后者。选择此选项的原因通常是,这种样式支持不太脆弱的测试——因为用户不必定义与假对象(或模拟对象,或任何您想称之为假对象的对象)的每次交互,当“不重要”的事情发生变化时,您的测试不会“无缘无故”中断

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

请注意,如果您想要严格的行为,您可以通过使用


这在很大程度上是一个基于意见的问题,可能会被关闭。然而,这里有一些信息。 首先,一些框架在默认情况下是严格的,而一些框架允许更松散的语义。假货倾向于后者。选择此选项的原因通常是,这种样式支持不太脆弱的测试——因为用户不必定义与假对象(或模拟对象,或任何您想称之为假对象的对象)的每次交互,当“不重要”的事情发生变化时,您的测试不会“无缘无故”中断

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

请注意,如果您想要严格的行为,您可以通过使用


您在
var thing=A.fake()行中定义了伪代码这将创建一个伪IThing对象(一个伪对象,它是一个IThing,而不是一个Thing对象)。0将只是int的默认值(因为您没有指定它返回任何其他值)。我不确定一般的异常行为,但在这种情况下它不会抛出,因为一切都是有效的。@Tone这不是我要问的。运行时异常是在.NET运行时调用未定义成员时的预期行为,因为它是强类型的,我的问题是为什么模拟框架的语义更松散这将创建一个伪IThing对象(一个伪对象,它是一个IThing,而不是一个Thing对象)。0将只是int的默认值(因为您没有指定它返回任何其他值)。我不确定一般的异常行为,但在这种情况下它不会抛出,因为一切都是有效的。@Tone这不是我要问的。运行时异常是在.NET运行时调用未定义成员时的预期行为,因为它是强类型的,我的问题是为什么模拟框架具有更松散的语义。
var thing= A.Fake<IThing>(options => options.Strict());
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; }
    }
}