我正在使用最小起订量进行测试。我将对象向上投射到其接口并发现了一个问题。
以下是显示问题的测试。
-
对象
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));
}