使用参数化构造函数嘲讽对象时,如果在构造函数中初始化的属性是虚拟的,则Moq不会设置属性值。但是,如果它是非虚拟财产,Moq设置价值。使用虚参数和参数构造函数的Moq行为
以下是我的课我想嘲笑。
public class Activity
{
private Activity() {}
public Activity(string code, string description, string option)
{
if(string.IsNullOrEmpty(code)) throw new ArgumentNullException("code");
if (string.IsNullOrEmpty(option)) throw new ArgumentNullException("option");
Code = code;
Description = description;
Option = option;
}
public virtual string Code { get; private set; }
public virtual string Description { get; private set; }
public virtual string Option { get; private set; }
}
这是我尝试嘲笑它:
[TestMethod]
public void It_Creates_Mock_For_A_Class()
{
var mock = new Mock<Activity>("Code 1", null, "Option");
Assert.IsNotNull(mock.Object);
Assert.AreEqual("Code 1", mock.Object.Code);
}
测试方法失败说: Assert.AreEqual失败。预期:。实际:<(null)>。
但是,如果我从所有属性中删除virtual关键字,它将起作用并通过测试用例。
由于实体框架的原因,我必须保持属性的虚拟性。
任何线索?如何解决这个问题?
其实测试的测试MOQ框架,而不是测试你的构造函数的实现。你想测试什么?你只问过最奇怪的MOQ行为吗? –
@IlyaPalkin上面只是一个例子,用于演示我在Moq遇到的虚拟/非虚拟属性时遇到的问题。由于这个问题,我试图编写的很多行为测试用例都失败了,因为Activity类的私有方法在内部使用这些属性并找到它们为空。 – 101V