【问题标题】:using Moq and NUnit , what is write approach / better syntax?使用 Moq 和 NUnit ,什么是编写方法/更好的语法?
【发布时间】:2010-01-15 11:00:29
【问题描述】:

我正在尝试测试这种行为

-- BLOGTableAdapter.GetBlogsByTitle(string title) 只被调用一次

-- 并用字符串调用 长度大于 1,

-- 它返回 BLOGDataTable 对象

 [Test]
    public void GetBlogsByBlogTitleTest4()
    {
        var mockAdapter = new Mock<BLOGTableAdapter>();
        var mockTable = new Mock<BLOGDataTable>();

        mockAdapter.Setup(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0))).Returns(mockTable.Object);

        var blogBl = new BlogManagerBLL(mockAdapter.Object);
        blogBl.GetBlogsByBlogTitle("Thanks for reading my question");

        mockAdapter.VerifyAll();
        mockAdapter.Verify(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0)), Times.Exactly(1));
    }

当调用 GetBlogsByTitle(string title) 时,在数据访问层中说“BlogManagerBLL”

public BLOGDataTable GetBlogsByBlogTitle(string title)
        {
            return Adapter.GetBlogsByTitle(title);
        }

如您所见,我使用两个单独的语句来完成这些检查

mockAdapter.Setup(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0))).Returns(mockTable.Object);    
mockAdapter.Verify(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0)), Times.Exactly(1));
  1. 我怎样才能把它合二为一 声明?
  2. 我在测试正确的东西吗?

谢谢

【问题讨论】:

  • 为什么要将它放在一个语句中?使用两个更清楚。
  • 因为为了一次检查,这个方法被调用一次,所以我必须写第二个语句。我找不到任何方法来检查第一个。
  • 不能在第一条语句中放入“Times.Exactly(1)”或类似的检查?

标签: c# unit-testing nunit installation moq


【解决方案1】:

如果你要测试两个东西,你应该写两个测试。

[Test]
public void BlogTableAdapter_should_be_called_with_string_having_length_greater_than_1()
{
    var mockAdapter = new Mock<BLOGTableAdapter>();

    var blogBl = new BlogManagerBLL(mockAdapter.Object);
    blogBl.GetBlogsByBlogTitle("Thanks for reading my question");

    mockAdapter.Verify(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0)));
}

[Test]
public void BlogTableAdapter_should_return_a_BLOGDataTable_object()
{
    var mockAdapter = new Mock<BLOGTableAdapter>();
    mockAdapter.Setup(x => x.GetBlogsByTitle(It.Is<string>(s => s.Length > 0))).Returns(new BLOGDataTable());

    var blogBl = new BlogManagerBLL(mockAdapter.Object);
    var returnValue = blogBl.GetBlogsByBlogTitle("Thanks for reading my question");

    Assert.That(returnValue, Is.TypeOf(typeof(BLOGDataTable)));
}

所以我想我的建议是不要将它们放在一起,为每个创建一个测试。我会说你正在测试正确的东西。

【讨论】:

  • 还有一点:虽然我们应该在我们的代码类中为相应的方法使用一个 [Test] 方法?您是在为相应方法的每次检查建议一种测试方法吗?假设我在一个类中有 3 个方法,每个要检查 4 件事,会有 12 个 [Test] 方法?写 ?应该为每个方法编写单独的 [TestFixture] 吗?
  • @Asad:Chris 是对的,我从来没有听说过每种方法只有一种测试方法。每个测试一个断言更标准。 The Art of Unit Testing 对此有很好的指导。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多