代码之家  ›  专栏  ›  技术社区  ›  user545642

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

  •  0
  • user545642  · 技术社区  · 1 年前

    我的类/接口设置如下:

    Room.cs

    //import statements
    
    namespace namespace1
    {
       internal class Room: Apartment
       {
          // constructor
          public Room(Furniture furniture) : base(furniture)
          {
          }
       }
    }
    

    公寓.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;
          }
       }
    }
    

    建筑.cs

    // import statements
    
    namespace namespace3
    {
       public abstract class Building
       {
          // constructor
          protected Building(IFurniture furniture)
          {
          }
       }
    }
    

    我想创建一个房间对象,带有一个模拟家具对象。以下是我所做的:

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

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

    编辑

    问题在于 Apartment.cs .它试图访问家具.chairs 无效的 。这是IFurniture.cs:

    public interface IFurniture
    {
       IChairs Chairs { get; }
    }
    
    2 回复  |  直到 1 年前
        1
  •  4
  •   AliReza Sabouri    1 年前

    根据你的例子,你需要嘲笑 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);
    
        2
  •  1
  •   Brian    1 年前

    你需要设置你的模型。

    [Test]
    public void fun()
    {
       var expectedChair = new Chair() {
           HasCushion = true  //etc
       };
       var mockedFurniture = new Mock<IFurniture>();
       mockedFurniture.Setup(furniture => furniture.Chairs).Returns(expectedChair);
       var room = new Room(mockedFurniture.Object);
    }
    

    请注意 expectedChair 很容易成为 mockChair 相反