在xUnit中正确使用理论



我一直在阅读有关xunit的文章,我有点困惑如何使用Theory。

假设我有这个测试:

[Theory]
[InlineData("")]
[InlineData("anything")]
public void AddItem_NoName_ThrowsNoNameException(string name)
{
    // Arrange.
    ItemService itemService = new ItemService();
    Item item = new Item();
    item.Name = name;
    // Act.
    Exception ex = Record.Exception(() => itemService.AddItem(item));
    // Assert.
    Assert.NotNull(ex);
    Assert.IsType<NoNameException>(ex);
}

和测试的方法:

public void AddItem(Item item)
{
    if (item.Name == "")
        throw new NoNameException();
    _DAL.AddItem(item);
}

因此,这将创建两个单元测试:一个传递空字符串 (") 的参数,另一个传递单词"anything"。所以第一个(空字符串)通过,因为我们有检查 if item 的代码。名称为空字符串,引发异常。然而,第二个失败了,因为单元测试中的 Assert.NotNull(ex) 将是假的。但是,如果您查看 AddItem 方法,该方法的编码正确,因此我想看到的是两个测试都通过。

也许我通过单元测试实现的方式是错误的,但是在这种情况下,我想发生的或我认为应该发生的事情是两个测试都应该通过,因为所测试的方法是正确的(基于规则)。我该怎么做?

更新:

好的,我已经设法通过下面的代码使这两者都通过。但是,我认为这是不正确的,有条件的断言。仍然需要帮助。

[Theory]
[InlineData("", false)]
[InlineData("anything", true)]
public void AddItem_NoName_ThrowsNoNameException(string name, isValid)
{
    // Arrange.
    ItemService itemService = new ItemService();
    Item item = new Item();
    item.Name = name;
    // Act.
    Exception ex = Record.Exception(() => itemService.AddItem(item));
    // Assert.
    if (!isValid)
    {
        Assert.NotNull(ex);
        Assert.IsType<NoNameException>(ex);
    }
    else
    {
        Assert.Null(ex);
    }
}

这是两个不同的测试用例,应该编写单独的测试。 当测试代码相同时,应使用Theory

[Theory]
[InlineData("")]
[InlineData(null)] // will fail based on your impl, just used for example
public void AddItem_NoName_ThrowsNoNameException(string name)
{
    // Arrange
    ItemService itemService = new ItemService();
    Item item = new Item();
    item.Name = name;
    // Act & Assert
    Assert.Throws<NoNameException>(() => itemService.AddItem(item));
}

[Fact]
public void AddItem_WithName_DoesXYZ()
{
    // Arrange
    ItemService itemService = new ItemService();
    Item item = new Item();
    item.Name = "anything";
    // Act
    itemService.AddItem(item);
    // Assert
    # verify item was added to db 
}

相关内容

  • 没有找到相关文章

最新更新