Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 此测试中的多个断言是否错误?_C#_Visual Studio_Unit Testing_Assert - Fatal编程技术网

C# 此测试中的多个断言是否错误?

C# 此测试中的多个断言是否错误?,c#,visual-studio,unit-testing,assert,C#,Visual Studio,Unit Testing,Assert,我正在尝试测试一个名为Login的方法,当用户和密码参数正确时,该方法将设置两个会话变量和三个cookie的值,并最终返回true 我已经读了好几篇关于单元测试的文章,但不知何故,这并没有让我完全明白我的情况。我知道每单元测试应该只有一个断言,尽管只要测试一个“逻辑概念”,就可以使用多个断言 Login方法只有在正确设置每个会话变量和cookie并返回预期值时才是正确的,所以我不确定一次检查所有这些值是否合适(这将导致我在单元测试中使用六个断言,我认为有点脏)或者我是否应该在不同的测试中分别检查

我正在尝试测试一个名为Login的方法,当用户和密码参数正确时,该方法将设置两个会话变量和三个cookie的值,并最终返回true

我已经读了好几篇关于单元测试的文章,但不知何故,这并没有让我完全明白我的情况。我知道每单元测试应该只有一个断言,尽管只要测试一个“逻辑概念”,就可以使用多个断言

Login方法只有在正确设置每个会话变量和cookie并返回预期值时才是正确的,所以我不确定一次检查所有这些值是否合适(这将导致我在单元测试中使用六个断言,我认为有点脏)或者我是否应该在不同的测试中分别检查每个会话变量和cookie的值

[TestMethod()]
public void SuccessfulLoginTest()
{
    // Arrange.
    String username = "foo";
    String password = "correct password";
    Boolean remember = true;

    // Act.
    Boolean actual = Login(username, password, remember);

    // Assert.
    Assert.IsTrue(actual);
    Assert.AreEqual("foo", HttpContext.Current.Session["Username"]);
    Assert.AreEqual(1, HttpContext.Current.Session["Group"]);
    Assert.AreEqual("foo", HttpContext.Current.Response.Cookies["Username"].Value);
    Assert.AreEqual("en", HttpContext.Current.Response.Cookies["Lang1"].Value);
    Assert.AreEqual("es", HttpContext.Current.Response.Cookies["Lang2"].Value);
}

在布尔变量中匹配条件,如果所有条件都满足,则布尔变量应返回true

使用此布尔变量

bool AreAllConditionsFulfilled = condition1 && condtionCheckingSessionVariablesOne && conditionCheckingSessionVariablesTwo
此外,我建议使用单独的测试用例测试每个会话变量,并断言它们是否正确

[Test]
public void TestUserNameSessionVariable()
{
//Login Code
Assert.AreEqual("foo", HttpContext.Current.Session["Username"]);
}

您已经正确地注意到,one-assert规则涉及概念断言,而不是对
assert
方法的简单调用。当一个逻辑断言由多个断言组成时,一个很好且常见的技巧是将断言包装在一个实用方法中,它可以减少混淆,并使测试更具可读性。在您的情况下,它可能类似于:

void AssertSessionIsValid(string username, int group, ...)
{
    Assert.AreEqual(username, HttpContext.Current.Session["Username"]);
    Assert.AreEqual(group, HttpContext.Current.Session["Group"]);
    ...
}

有许多框架可以帮助提高测试的可读性,比如。

对我来说也不错。我不确定您是从哪里得到这样的概念的:每个单元测试应该只有一个断言。这听起来像是一个简单的“象牙塔”规则。如果你的方法设置了一组给定特定输入的变量,那么你应该检查给定该输入的所有变量。编写六个不同的单元测试(以及相关的设置代码)似乎效率极低


但是,在编写软件时,我倾向于实用主义,而不是学术上的“正确性”。

我建议坚持你所关心的一切都是“工作”,仅此而已。断言太少,您的测试将忽略明显损坏的功能;太多,当一些不相关的细节发生变化时,您的测试将变得脆弱,不必要地中断。

规则规定每个测试一个逻辑断言,OP已经提到了这一点。这既不是“学术”也不是“愚蠢”。也许“每个测试一个逻辑断言”意味着每个断言一个子句,所以不要使用
assert(天空(蓝色)&&thesais)(deep));
但是使用
Assert(天空(蓝色));
Assert(seais(deep));
。每个测试用例应该只有一个Assert。