【问题标题】:How to set values in GetName in IDataReader?如何在 IDataReader 的 GetName 中设置值?
【发布时间】:2016-12-08 19:14:37
【问题描述】:

我正在使用 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 中排列值进行测试?

【问题讨论】:

    标签: c# unit-testing mocking rhino-mocks rhino-mocks-3.5


    【解决方案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&lt;string&gt; 一起使用。

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

    顺便说一句;您没有将 columns 初始化为新实例

    【讨论】:

      【解决方案2】:

      您应该简单地使用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");
      

      【讨论】:

      • 感谢您的回答。我更新了代码,但遇到了 nullreferenceexception。请查看更新后的代码。对这个问题仍然很困惑......谢谢
      • 该异常与Rhino Mocks无关,您只需初始化您的columns变量,例如: List columns = new List();
      • 没问题 - 我的回答有帮助吗?你在寻找其他东西吗?
      猜你喜欢
      • 2021-12-12
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 2019-07-17
      • 2021-07-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多