如何在单个参数化测试方法中断言真假

How to assert true and false in single parameterized test method

我是单元测试的新手,对从方法依赖参数测试真假结果感到很困惑 return。我目前正在使用 NUnit 和 MoQ,下面是我的代码。测试将 运行 三次,每次分别使用值 A、B、C。

[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 接收值的方法,它将 return true 如果参数取值为A,否则为returnfalse。我不知道如何在单个测试中呈现这种测试。

我认为我不能使用多个断言(我的意思是一个断言为真,另一个为假),因为每次测试都会将结果评估为真或假。我想我可以使用 TestCaseExpectedResult OR Assume before Assert OR write two test(one for A值和其他值)但我想知道我们是否有任何复杂的方法来实现这种测试。

我的期望是三个测试将通过,评估的真假取决于单个测试中提供的值。如果我没有走上正确的单元测试轨道,请告诉我。

mock 的设置是我介绍 IFoo.DoSomething 方法的实现方式。它的逻辑是 return 如果值为 A 则为真,否则为假。

您实际上想在这里测试什么?您设置的模拟,您可以完全控制,有条件地 return 是真还是假?

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

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

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

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

通常我希望单元测试能够测试具体的实现(例如Foo)。 Foo 需要的任何依赖项(例如 IBar)都将被模拟。

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

public void DoSomething_A_ReturnsTrue()

public void DoSomething_NotA_ReturnsFalse()

每个人都会执行创建 Foo 实例所需的任何设置,使用与测试描述匹配的值调用 DoSomething,最后是与预期测试结果匹配的单个断言(对或错)。