尝试添加一个类,但无法访问非接口方法

时间:2019-02-08 17:04:44

标签: c# unit-testing moq mstest

说我有接口

public interface IVehicle<T>
{
    string Drive();
    string Stop();
}

还有两个类Car()和Aeroplane()

每个类都有一个使用该界面执行操作的类

public class CarActions : IVehicle<Car>
{
    public string Drive()
    {
        return "Go";
    }

    public string Stop()
    {
        return "Stop";
    }
}

public class AeroplaneActions : IVehicle<Aeroplane>
{
    public string Drive()
    {
        return "Go";
    }

    public string Stop()
    {
        return "Stop";
    }

    public virtual string Fly()
    {
        return "Fly";
    }     
}

当我模拟Airplane类时,因为它不是接口的一部分,所以找不到fly()方法

  Mock<AeroplaneActions> mockedDirectly = new Mock<AeroplaneActions>();

        mockedDirectly.Setup(method => method.Drive()).Returns("Drive");
        mockedDirectly.Setup(method => method.Stop()).Returns("Stop");
        mockedDirectly.Setup(method => method.Fly()).Returns("Fly");

我尝试直接模拟确实起作用的Actions类,但是在这种情况下,我需要避免将方法更改为虚方法。

        Mock<AeroplaneActions> mockedDirectly = new Mock<AeroplaneActions>();

        mockedDirectly.Setup(method => method.Drive()).Returns("Drive");
        mockedDirectly.Setup(method => method.Stop()).Returns("Stop");
        mockedDirectly.Setup(method => method.Fly()).Returns("Fly");

我想知道除使用虚拟方法外,还有其他替代方法吗?

1 个答案:

答案 0 :(得分:1)

也许您可以为AeroplaneActions创建另一个接口,该接口将从IVehicle<T>继承并具有Fly方法,例如像这样:

public interface IAeroplane<T> : IVehicle<T> 
{ 
    string Fly(); 
}. 

然后类AeroplaneActions将实现此接口:

AeroplaneActions : IAeroplane<Aeroplane>

然后应该可以模拟此接口:

var mock = new Mock<IAeroplane<Aeroplane>>().