You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#单元测试:使用Moq创建继承类对象遇空引用问题求解

解决Moq模拟IFurniture时Chairs属性为空的问题

核心原因是Moq创建的Mock<IFurniture>默认不会自动初始化嵌套属性,当Apartment构造函数访问furniture.Chairs时,这个属性是null,自然会引发异常。下面是具体的解决步骤:

1. 显式模拟Chairs属性的返回值

Moq对接口属性的默认返回是default(T)(引用类型即为null),所以必须手动设置Chairs的返回内容。假设你的IFurniture接口定义了Chairs属性(比如IChair[] Chairs { get; }),示例代码如下:

// 先模拟单个椅子实例(如果Chairs是集合类型)
var mockChair = new Mock<IChair>();
// 若需要,还可以给椅子的属性设置返回值,比如mockChair.Setup(c => c.Count).Returns(4);

// 创建IFurniture的Mock并设置Chairs属性
var mockFurniture = new Mock<IFurniture>();
mockFurniture.Setup(f => f.Chairs).Returns(new[] { mockChair.Object });

2. 确保内部类Room可被测试项目访问

因为Room是内部类,需要在被测试项目的AssemblyInfo.cs中添加以下代码,允许测试项目访问内部类型:

[assembly: InternalsVisibleTo("你的测试项目名称")]

3. 用模拟好的对象创建Room实例

现在可以直接使用mockFurniture.Object作为构造参数创建Room对象:

var room = new 外部类名称.Room(mockFurniture.Object);

特殊场景处理

如果Chairs是具体类而非接口,也可以直接实例化真实对象返回,无需额外模拟:

mockFurniture.Setup(f => f.Chairs).Returns(new[] { new Chair { Id = 1, Quantity = 4 } });

关键提醒:所有被父类构造函数访问的IFurniture成员,都需要在Moq中显式设置返回值,不能依赖默认行为。

内容的提问来源于stack exchange,提问作者user545642

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 15:10:00