gpt4 book ai didi

c# - 单元测试抛出 "System.NullReferenceException",使用 Moq 和 Nunit

转载 作者:太空宇宙 更新时间:2023-11-03 22:20:51 24 4
gpt4 key购买 nike

我是最小起订量和单元测试的新手。所以,我不是很了解。如果问题很愚蠢,请原谅我。请帮助我理解以下场景。

以下是我的简单测试

[Test]
public void TryMoq() {
var mock = new Mock<IDummyInterface>();
var dummy = new DummyClass(mock.Object);
mock.VerifySet(m => m.Model = It.Is<DummyModel>(mo => mo.MyProperty == "foo"));
}

以及我要测试的代码

public class DummyClass
{
public DummyClass(IDummyInterface i) {
i.Model = new DummyModel() ;
i.Model.MyProperty = "foo";

}
}

public class DummyModel
{
public string MyProperty { get; set; }
}

public interface IDummyInterface {
DummyModel Model { get; set; }
}

现在在行 "i.Model.MyProperty = "foo";"正在抛出“System.NullReferenceException”。

为什么,我想是因为我在使用 Moq。

奇怪的是,如果我更改“DummyClass”的构造函数。像这样

public DummyClass(IDummyInterface i)
{
i.Model = new DummyModel() { MyProperty ="foo"};
//i.Model.MyProperty = "foo";

}

测试通过。在第二种情况下,即使我尝试将“foo”的值更改为“bar”。测试失败。(这很好)。

我只是想了解发生了什么。以及我应该如何最小起订量和验证子属性。

最佳答案

这两种情况的区别在于当你写

i.Model = new DummyModel() { MyProperty ="foo"};

你本质上是在写

var dummyModel = new DummyModel() { MyProperty ="foo"};
i.Model = dummyModel;

也就是说,您将一个属性已设置为“Foo”的对象传递给您的界面。您的测试断言“有人会尝试将 Mock 上的属性设置为 DummyModel 类型的对象,其中属性 MyProperty 设置为“Foo””,这正是正在发生的事情。

第一种情况失败,因为在执行以下行后,i.Model 为空。

i.Model = new DummyModel();

直接在 Mock 上获取或设置属性不会设置该属性,它只会不执行任何操作或返回 null,除非您指定您希望它执行的操作。因此,在这种情况下,在构造函数的第二行中,i.Model 为 null,这会导致 i.Model.MyProperty 出现 null 异常。

关于c# - 单元测试抛出 "System.NullReferenceException",使用 Moq 和 Nunit,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3151858/

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