需要帮助使用Moq

时间:2012-02-29 01:39:05

标签: c# .net unit-testing moq

我在单元测试中遇到麻烦,所以我做了一个简单的例子来说明我的问题。我有以下......

public class SomeClass : ISomeInterface
    {
        public int ID { get; set; }
        public string Desc { get; set; }

        public int Create(SomeClass t)
        {
            return 5;
        }

        public int Create2(string s)
        {
            return 7;
        }
    }

    public interface ISomeInterface
    {
        int Create(SomeClass t);
        int Create2(string s);
    }

现在我有两种方法来测试模拟接口

    private void TestCreate()
    {
        var mocker = new Mock<ISomeInterface>();
        mocker.Setup(x => x.Create(new SomeClass())).Returns(3);
        var result = mocker.Object.Create(new SomeClass());
    }

    private void TestCreate2()
    {
        var mocker = new Mock<ISomeInterface>();
        mocker.Setup(x => x.Create2("Test")).Returns(4);
        var result = mocker.Object.Create2("Test");
    }

TestCreate2工作并返回模拟结果“4”
然而,TestCreate返回“0”而不是“3”

我需要能够模拟接受自定义类作为参数而不是简单的int和字符串的方法吗?

1 个答案:

答案 0 :(得分:3)

是的,这是因为当你获得在安装调用期间传入的SomeClass实例时,你已经设置了TestCreate返回3。但是,由于您新建了实例内联,因此在实际Create调用期间传入的实例是不一样的。以下任一选项都可以解决您的问题......

private void TestCreate()
{
    var mocker = new Mock<ISomeInterface>();
    mocker.Setup(x => x.Create(It.IsAny<SomeClass>())).Returns(3);
    var result = mocker.Object.Create(new SomeClass());
}

private void TestCreate()
{
    var mocker = new Mock<ISomeInterface>();
    var someClass = new SomeClass();
    mocker.Setup(x => x.Create(someClass)).Returns(3);
    var result = mocker.Object.Create(someClass);
}