我是单元测试的新手,对于测试方法依赖参数返回的正确或错误结果非常困惑。我目前正在使用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。我以为可以在断言之前使用TestCase和ExpectedResult或Assume或编写两个测试(一个用于A值,另一个用于其他值),但是我想知道我们是否有任何复杂的方法实现该测试的方法。
我的期望是,将通过单项测试中提供的值来评估是真还是假的三项测试。如果我没有正确进行单元测试,请告诉我。
模拟的设置是我介绍IFoo.DoSomething方法的实现的方式。如果value为A,则其逻辑返回true,否则返回false。
您实际上在这里尝试测试什么?您已建立的模拟程序,拥有完全的控制权,将有条件地返回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
,最后调用与预期测试结果相匹配(正确或错误)的单个断言。] >