Moq - 设置强类型类的返回值

时间:2012-05-18 06:17:25

标签: c# unit-testing mocking moq

尝试使用moq进行单元测试。

这是一个类结构。

public interface IParameter<T> : IList<T>
{
}

public interface IParameters
{
    IParameter<string> Types;
}

public class MyClass
{
    public DataTable GetResult(IParameters parameters)
    {
        //do work here
        return dt;
    }
}

class TestMyClass
{
    [Test]
    public void TestGetResult()
    {
        var _mock = new Mock<IParameters>();
        _mock.SetUp(x => x.Types).Return(new [] {"1", "2"}); //Issue
        var m = new MyClass()
        var result = m.GetResult(_mock.Object)
        Assert.IsNotNull(result);
    }
}

我需要学习如何正确调用_mock.SetUp,以便IParameters中的属性返回IList类型。

或者,我也试过这个......

var mock = new Mock<IParameters>();
var mockparams = new Mock<IParameter<string>>(); 
mockparams.SetReturnsDefault( ); //What should i call to add { "1", "2", "3" } 
mock.Setup(x => x.ReportTypes).Returns(mockparams.Object);

所以在mockparams中我应该调用什么函数来设置返回值?

2 个答案:

答案 0 :(得分:6)

BTW:IParameters.Types是属性还是方法?

您可以为IParameter参数创建一个存根,因为您可能不希望设置IList的每个方法:

class ParameterStub : List<String>, IParameter<String> { }

然后,模仿IParameters就像这样简单:

...
var mock = new Mock<IParameters>();
mock.Setup(x => x.Types).Returns(new ParameterStub() {"1","2"});
var m = new MyClass();
var result = m.GetResult(mock.Object);
...

答案 1 :(得分:2)

你应该模拟IParameter并返回模拟对象而不是new [] {“1”,“2”}