【发布时间】:2013-11-01 15:58:34
【问题描述】:
在使用参数化构造函数模拟对象时,如果在构造函数中初始化的属性是虚拟的,则 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 关键字,它会起作用并通过测试用例。
由于实体框架,我必须保持虚拟属性。
有什么线索吗?如何解决这个问题?
【问题讨论】:
-
实际上,您的测试测试的是 MOQ 框架,而不是测试您的构造函数实现。你想测试什么?您只询问奇怪的起订量行为吗?
-
@IlyaPalkin 以上只是一个示例,用于演示在虚拟/非虚拟财产的情况下我在使用起订量时遇到的问题。由于这个问题,我尝试编写的许多行为测试用例都失败了,因为 Activity 类的私有方法在内部使用这些属性并发现它们为空。
标签: c# unit-testing moq