2013-11-21 36 views
4

我想测试一个名为Login的方法,当用户和密码参数正确时,设置两个会话变量和三个cookie的值,最后返回true。在这个测试中是否有多个断言错误?

我一直在阅读关于单元测试的几篇文章,但不知何故,这并没有让我的案例完全清楚。我知道每个单元测试应该只有一个断言,尽管只要测试一个“逻辑概念”就可以使用多个测试。

只有当它正确设置每个会话变量和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); 
} 
+4

看起来不错! – Heinzi

+0

这个想法,每个测试用例应该只有一个断言[是愚蠢的](http://stackoverflow.com/a/20300843/545127)。 – Raedwald

回答

3

对我也很好。我不确定你认为每个单元测试应该只有一个Assert的概念。这听起来像是一个“象牙塔”的规则,这只是简单的傻海事组织。如果您的方法在给定特定输入的情况下设置了一堆变量,那么您应该检查给定该输入的所有变量。编写六个不同的单元测试(和相关的设置代码)似乎非常低效。

但是,当谈到编写软件时,我倾向于倾向于学术“正确性”的实用主义。

+0

规则说每个测试都有一个*逻辑断言*,这已经被OP提及。这不是“学术”,也不是“傻”。 – BartoszKP

+2

也许“每个测试一个逻辑断言”意味着每个断言一个子句,所以不要使用'Assert(theSkyIs(blue)&& theSeaIs(deep));'但是使用Assert(theSkyIs(blue));'和'Assert theSeaIs(深));'。 – AdrianHHH

-1

让您的条件与布尔变量相匹配,如果所有条件都满足,那么布尔变量应该返回true。

资产这个布尔变量

bool AreAllConditionsFulfilled = condition1 && condtionCheckingSessionVariablesOne && conditionCheckingSessionVariablesTwo 

另外我建议有单独的测试用例测试每个会话变量,并声称,如果他们是正确的。

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

你已经正确注意到,该一个断言规则关注概念性的说法,没有裸露的来电来Assert方法。当一个逻辑断言由许多断言组成并且还使得测试更可读时,这是一个很好且常见的技巧,它将断言封装在实用程序方法中。你的情况可能与此类似:

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

有很多框架,增加你的测试的可读性,像Shouldly帮助。

1

我会建议断言你关心的所有事情都是'正在工作',不过是这样。太少断言,你的测试将忽略清楚的功能破坏;太多了,你的测试会变得脆弱,并且在一些不相关的细节变化时不必要地突破。

相关问题