2

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

以下是显示问题的测试。

  • 对象

    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属性?

4

1 回答 1

0

默认情况下,当您 Mock 一个具体类型时,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));
}
于 2015-06-20T13:57:21.183 回答