如何在单一参数化测试方法中断言是非

问题描述 投票:0回答:1

我是单元测试的新手,对于测试方法依赖参数返回的正确或错误结果非常困惑。我目前正在使用NUnit和MoQ,下面是我的代码。测试将分别以A,B,C值运行3次。

[Test]
    public void IFoo_Return_True_With_A_As_Input([Values("A", "B", "C")]string value){
        var mock = new Mock<IFoo>();
        // setup
        mock.Setup(foo => foo.DoSomething("A")).Returns(true);

        // Arrage
        Func<string, bool> action = (_) => mock.Object.DoSomething(_);

        // Act
        bool result = action(value);

        // Assert
        Assert.That(result, /* ??? */);
    }

我有一个通过参数IFoo.DoSomething接收值的方法,如果参数的值为A它将返回true,否则将返回false。我不知道如何在单项测试中提出这种测试。

我以为我不能使用多个断言(我的意思是一个断言为true,另一个断言为false),因为每次测试结果将被评估为true或false。我以为可以在断言之前使用TestCaseExpectedResultAssume或编写两个测试(一个用于A值,另一个用于其他值),但是我想知道我们是否有任何复杂的方法实现该测试的方法。

我的期望是,将通过单项测试中提供的值来评估是真还是假的三项测试。如果我没有正确进行单元测试,请告诉我。

模拟的设置是我介绍IFoo.DoSomething方法的实现的方式。如果value为A,则其逻辑返回true,否则返回false。

unit-testing nunit
1个回答
0
投票

您实际上在这里尝试测试什么?您已建立的模拟程序,拥有完全的控制权,将有条件地返回true或false?

您当前的设置将执行此操作-.DoSomething("A")将返回true,而发射到DoSomething的所有其他字符串值将返回默认布尔值(false)。如果您未设置方法,它将返回返回类型的默认值。

您可以在单个断言中指定的情况下断言:

Assert.That(result, Is.EqualTo(value.Equals("A")))

...但我不确定为什么要这么做。您不是在测试代码,而是在测试Moq /您的模拟设置。

[通常,我希望单元测试可以测试具体的实现(例如Foo)。 Foo需要的任何依赖项(例如IBar)都会被嘲笑。

假设您有一个实现Foo的具体实现IFoo.DoSomething(string)。您将编写2个测试方法,如下所示:

public void DoSomething_A_ReturnsTrue()

public void DoSomething_NotA_ReturnsFalse()

每个人都将进行创建Foo的实例所需的任何设置,使用与测试描述相匹配的值调用DoSomething,最后调用与预期测试结果相匹配(正确或错误)的单个断言。] >

© www.soinside.com 2019 - 2024. All rights reserved.