C#、Moq、单元测试:如何创建从另一个类继承的对象?

Dar*_*eth 1 c# unit-testing dependency-injection moq mocking

我的类/接口设置如下:

房间.cs

//import statements

namespace namespace1
{
   internal class Room: Apartment
   {
      // constructor
      public Room(Furniture furniture) : base(furniture)
      {
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

公寓.cs

// import statements

namespace namespace2
{
   public abstract class Apartment: Building
   {
      private int numChairs = 0;

      // constructor
      protected Apartment(IFurniture furniture) : base(IFurniture furniture)
      {
         this.numChairs = furniture.chairs.Length;
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

建筑.cs

// import statements

namespace namespace3
{
   public abstract class Building
   {
      // constructor
      protected Building(IFurniture furniture)
      {
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

我想创建一个 Room 对象,其中包含一个模拟的 Furniture 对象。这是我所做的:

[Test]
public void fun()
{
   var mockedFurniture = new Mock<IFurniture>();
   var room = new Room(mockedFurniture.Object);
}   
Run Code Online (Sandbox Code Playgroud)

问题:因为 的 构造函数Room调用base(furniture), 的 构造函数Apartment正在尝试访问furniture.chairs,即null。我怎么能嘲笑这个呢?

编辑

问题在于Apartment.cs。它尝试访问 Furniture.chairs,即null. 这是 IFurniture.cs:

public interface IFurniture
{
   IChairs Chairs { get; }
}
Run Code Online (Sandbox Code Playgroud)

Ali*_*eza 6

根据你的例子,你IChairs也需要模拟。

var mockedChairs = new Mock<IChairs>();
var mockedFurniture = new Mock<IFurniture>();
mockedFurniture.Setup(q=>q.Chairs).Returns(mockedChairs.Object);
var room = new Room(mockedFurniture.Object);
Run Code Online (Sandbox Code Playgroud)