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
相关产品推荐
相关产品推荐

