gpt4 book ai didi

c# - 具有虚拟属性和参数构造函数的最小起订量行为

转载 作者:行者123 更新时间:2023-11-30 22:12:45 24 4
gpt4 key购买 nike

在使用参数化构造函数模拟对象时,如果在构造函数中初始化的属性是虚拟的,Moq 不会设置属性值。但如果是非虚拟属性(property),则 Moq 设置该值。

以下是我要模拟的类(class)。

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 关键字,它就可以工作并通过测试用例。

由于 Entity Framework,我必须保持虚拟属性。

有什么线索吗?如何解决这个问题?

最佳答案

发现如果“CallBase”属性设置为 true,问题就解决了。

通过查看对象浏览器中的程序集,总结如下:

总结:如果没有匹配的设置,是否将调用模拟类的基本成员虚拟实现。默认为假。

有效代码:

    [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);
}

关于c# - 具有虚拟属性和参数构造函数的最小起订量行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19540609/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com