将Mock具体对象转换为接口导致的空实现

时间:2015-11-05 11:47:30

标签: c# .net unit-testing mocking moq

我使用moq一段时间进行单元测试, 我想知道为什么我的模拟对象无法转换为接口,即使它实现了接口方法在转换为接口后没有返回任何内容,这里是我的简单代码:

POSRepository repo = this.mockPosRepository.Object;
IPOSRepository posRepo = repo;
if(repo.Prices.Count() > 0) // True
if(posRepo.Prices.Count() > 0) // false

我错过了什么吗?

2 个答案:

答案 0 :(得分:0)

您可以使用As方法将接口添加到模拟对象,如下所示:

mockPosRepository.As<IPOSRepository>();

不幸的是,如果类实现了接口,moq不仅可以解决它应该能够转换对象。

答案 1 :(得分:0)

@domysee,thx为你的回复我通过检查创建过程设法解决了这个问题,我应该创建一个真正的类而不是模拟类...我创建一个类似这个代码的问题

   [TestMethod]
    public void Test_Clean_Price()
    {
        Mock<CalcProcessor> calcProcessor = new Mock<CalcProcessor>();
        calcProcessor.Setup(s => s.AddProcessor(It.IsAny<int>(), It.IsAny<int>())).Returns(1);
        Mock<Calc> calc = new Mock<Calc>(calcProcessor.Object);//this should not a mock object
        ICalc icalc = calc.Object;
        int resultObject = calc.Object.Add(1, 2);
        int resultInterface = icalc.Add(1, 2);

        Assert.AreEqual(1,resultObject);//result 0
        Assert.AreEqual(1, resultInterface);//result 0

    }
}
public class CalcProcessor
{
    public virtual int AddProcessor(int a, int b)
    {
        return a + b;
    }
}

public class Calc : ICalc
{
    private CalcProcessor cp;

    public Calc(CalcProcessor calcp)
    {
        this.cp = calcp;
    }
    public virtual int Add(int a, int b)
    {
        return this.cp.AddProcessor(a,b);
    }

    public virtual int Substract(int a, int b)
    {
        throw new NotImplementedException();
    }
}


public interface ICalc
{
    int Add(int a, int b);

    int Substract(int a, int b);
}