在下面的示例中,即使尚未定义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);
}
答案 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; }
}
}