向上投射到最小起订量上的接口不起作用

本文关键字:接口 不起作用 | 更新日期: 2023-09-27 17:56:51

我正在使用最小起订量进行测试。我将对象向上投射到其接口并发现了一个问题。

以下是显示问题的测试。

  • 对象

    public interface IVehicle { string Model { get; } }
    public interface ICar : IVehicle { }
    public class Golf : ICar
    {
        public Golf(string model)
        {
            this.Model = model;
        }
        public string Model { get; private set; }
    }
    
  • 测试失败

    [TestMethod]
    public void InheritanceInterface_Test_WithMoq()
    {
        string golfmodel = "gti";
        var gti = new Moq.Mock<Golf>(golfmodel).Object;
        var safeVehicle = gti as IVehicle;
        var vehicle = (IVehicle)gti;
        var safeCar = gti as ICar;
        var car = (ICar)gti;
        Assert.AreEqual(golfmodel, gti.Model, string.Format(" Model:{0} | Golf Model:{1}", golfmodel, gti.Model));
        Assert.AreEqual(gti.Model, safeVehicle.Model, string.Format("Golf Model:{0} | Vehicle Model:{1}", gti.Model, safeVehicle.Model));
        Assert.AreEqual(gti.Model, vehicle.Model, string.Format("Golf Model:{0} | Vehicle Model:{1}", gti.Model, vehicle.Model));
        Assert.AreEqual(gti.Model, safeCar.Model, string.Format("Golf Model:{0} | Carro Model:{1}", gti.Model, safeCar.Model));
        Assert.AreEqual(gti.Model, car.Model, string.Format("Golf Model:{0} | Carro Model:{1}", gti.Model, car.Model));
    }
    
  • 测试通过

    [TestMethod]
    public void InheritanceInterface_Test()
    {
        string golfmodel = "gti";
        var gti = new Golf(golfmodel);
        var vehicle = (IVehicle)gti;
        var car = (ICar)gti;
        Assert.AreEqual(golfmodel, gti.Model, string.Format(" Model:{0} | Golf Model:{1}", golfmodel, gti.Model));
        Assert.AreEqual(gti.Model, vehicle.Model, string.Format("Golf Model:{0} | Vehicle Model:{1}", gti.Model, vehicle.Model));
        Assert.AreEqual(gti.Model, car.Model, string.Format("Golf Model:{0} | Carro Model:{1}", gti.Model, car.Model));
    }
    

如何更改它,以便当我将Mock<Golf>.Object转换为其接口之一时,我仍然可以访问 Model 属性?

向上投射到最小起订量上的接口不起作用

默认情况下,当您模拟具体类型时,Moq 不会调用虚拟方法或实现接口。 只有当你告诉它它可以调用基实现时,它才会这样做,否则它会假设你将在需要调用这些方法时设置它们。 如果将测试更改为以下内容,它将起作用:

[TestMethod]
public void InheritanceInterface_Test_WithMoq()
{
    string golfmodel = "gti";
    var golfMock = new Moq.Mock<Golf>(golfmodel);
    golfMock.CallBase = true;  // Tell the mock to call base methods
    var gti = golfMock.Object;
    var safeVehicle = gti as IVehicle;
    var vehicle = (IVehicle)gti;
    var safeCar = gti as ICar;
    var car = (ICar)gti;
    Assert.AreEqual(golfmodel, gti.Model, string.Format(" Model:{0} | Golf Model:{1}", golfmodel, gti.Model));
    Assert.AreEqual(gti.Model, safeVehicle.Model, string.Format("Golf Model:{0} | Vehicle Model:{1}", gti.Model, safeVehicle.Model));
    Assert.AreEqual(gti.Model, vehicle.Model, string.Format("Golf Model:{0} | Vehicle Model:{1}", gti.Model, vehicle.Model));
    Assert.AreEqual(gti.Model, safeCar.Model, string.Format("Golf Model:{0} | Carro Model:{1}", gti.Model, safeCar.Model));
    Assert.AreEqual(gti.Model, car.Model, string.Format("Golf Model:{0} | Carro Model:{1}", gti.Model, car.Model));
}