如何在单个参数化测试方法中断言真假
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。我不知道如何在单个测试中呈现这种测试。
我认为我不能使用多个断言(我的意思是一个断言为真,另一个为假),因为每次测试都会将结果评估为真或假。我想我可以使用 TestCase 和 ExpectedResult 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
,最后是与预期测试结果匹配的单个断言(对或错)。
我是单元测试的新手,对从方法依赖参数测试真假结果感到很困惑 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。我不知道如何在单个测试中呈现这种测试。
我认为我不能使用多个断言(我的意思是一个断言为真,另一个为假),因为每次测试都会将结果评估为真或假。我想我可以使用 TestCase 和 ExpectedResult 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
,最后是与预期测试结果匹配的单个断言(对或错)。