0

我正在使用 Rhino Mocks 来测试以下方法。

    public static List<string> RetrieveColumnNames(IDataReader reader)
    {
        List<string> columns = null;

        for (int i = 0; i < reader.FieldCount; i++)
        {
            columns.Add(reader.GetName(i));
        }

        return columns;
    }

有这样的事情,但不知道如何继续:

    [TestMethod()]
    public void RetrieveColumnNamesTest()
    {
        //Arrange
        IDataReader reader = MockRepository.GenerateStub<IDataReader>();

        reader.Stub(x => x.FieldCount).Return(2);
        reader.Stub(x => x.name...) // not gonna happen

        //Act
        using (reader)
        {
            List<string> list = RetrieveColumnNames(reader);

            //Assert
            Assert.AreEqual(2, list.Count);
        }

    }

但是如何在GetName测试方法中安排值?

4

2 回答 2

1

编写 UT 的正确方法是:

[TestMethod]
public void TestMethod1()
{
    const string FIRST = "First Name";
    const string SECOND = "Second Name";

    var reader = MockRepository.GenerateStub<IDataReader>();

    reader.Stub(x => x.FieldCount).Return(2);
    reader.Stub(x => x.GetName(0)).Return(FIRST);
    reader.Stub(x => x.GetName(1)).Return(SECOND);

    var actual = RetrieveColumnNames(reader);

    CollectionAssert.AreEquivalent(new [] {FIRST, SECOND}, actual);

}

在这种情况下使用是一种不好的做法IgnoreArguments().Repeat.Once(),主要是因为调用排序可能会出现问题(并且可读性较差......),另一种选择是使用Do带有List<string>.

CollectionAssert提供验证返回值的最佳功能。

顺便提一句; 你没有初始化columns到新实例

于 2016-12-22T23:39:18.297 回答
0

您应该简单地使用Repeat
如果您希望返回相同的值:

reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Any().Return("My Name");

如果您希望返回不同的值:

reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Once().Return("First Name");
reader.Stub(x => x.GetName(0)).IgnoreArguments().Repeat.Once().Return("Second Name");
于 2016-12-08T20:55:34.023 回答