具有虚拟属性和参数构造函数的最小起订量行为
本文关键字:虚拟 属性 构造函数 参数 | 更新日期: 2023-09-27 18:36:28
在使用参数化构造函数模拟对象时,如果在构造函数中初始化的属性是虚拟的,则 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失败了。预期:。实际:<(空)>。
但是,如果我从所有属性中删除 virtual 关键字,它将起作用并通过测试用例。
由于实体框架,我必须使属性保持虚拟。
有什么线索吗?如何解决这个问题?
发现如果"CallBase"属性设置为 true,则解决了问题。
通过在对象浏览器中查看程序集,摘要显示:
总结:如果没有匹配的设置,是否将为模拟类调用基本成员虚拟实现。默认为 false。
有效的代码:
[TestMethod]
public void It_Creates_Mock_For_A_Class()
{
var mock = new Mock<Activity>("Code 1", null, "Option");
mock.CallBase = true;
Assert.IsNotNull(mock.Object);
Assert.AreEqual("Code 1", mock.Object.Code);
}