C# 模拟框架不抛出异常的原因是什么
在下面的示例中,fakeitesy返回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
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; }
}
}