当string是另一个字符串的选定有序子集时,单元测试应该失败

时间:2016-01-09 08:26:03

标签: c# unit-testing visual-studio-2013

我是第一次在visual studio 2013中编写单元测试。

我正在尝试编写测试用例以确保:新密码不应包含用户全名的任何4个连续字符。

假设用户的全名是:“John Yan”,那么如果用户输入密码“HnYa @ 123”,它就会失败。

这是我的代码

[TestMethod]
public void Password_Contain_4_Successive_Characters_Of_User_FullName()
{
    UserInformation u = new UserInformation();
    string newPassword = "Mave@123";
    string username = "mary@mywebsite.com";
    var browser = BrowserWindow.Launch(browserURL);
    ClickLink(browser, "Patient");
    ClickLink(browser, "here");
    EnterText(browser, "username", username);
    ClickButtion(browser, "Reset");
    browser.Close();
    var changePasswordBrowser = BrowserWindow.Launch(browserChangePasswordURL);
    EnterText(changePasswordBrowser, "UserLogin", username);
    EnterText(changePasswordBrowser, "TemporaryPassword", u.GetTemporaryPassword(username));
    EnterText(changePasswordBrowser, "NewPassword", newPassword);
    EnterText(changePasswordBrowser, "ConfirmNewPassword", newPassword);
    ClickButtion(changePasswordBrowser, "Submit");
    Assert.AreEqual(newPassword, u.GetUserPassword(username));

}

我应该使用哪个Assert.,如果新密码包含4个用户全名的连续字符,单元测试会失败?

3 个答案:

答案 0 :(得分:1)

虽然目前接受的answer似乎解决了您的确切问题,但您并不觉得自己真的在问正确的问题。单元测试的目的是确保您的生产逻辑能够满足您的期望。它不是为了实现您的业务逻辑。

查看您的问题,您的要求似乎是:

  • 当用户设置新密码时,请确保其中不包含用户全名中的4个连续字符。 (目前还不清楚发生这种情况会发生什么,但我会假设某种反馈给用户/失败响应)。

这是需要在生产代码中实施的业务规则。所以,在伪代码中,你会得到:

if(StringContainsSuccessiveCharacters(newPassword, u.GetFullName(), 4)) {
    // Handle Error Situation
}
else {
    // Password is fine, proceed (save to db, do other checks etc)
}

在测试中,您将提供不同的FullName和密码(例如@Ruskin中的测试用例),以便运用您的代码并确保在新密码执行包含4个连续的字符,发生了可观察的错误情况,并且当它没有成功的情况发生时。所以,你最终可能会得到一些像这样的测试:

WhenPasswordContains4SuccessiveCharactersFromNameErrorShouldBeDisplayed() {
    string fullName = "John Yan";
    string newPassword = "HnYa@123";

    // Do setup stuff (mocks/browser etc)

    // Try and set password to newPassword

    // Validate that validation error was triggered
    // Which could be as simple as checking that the password isn't changed
}

PasswordCanBeChangedWhenAllValidationRulesPass() {
    string fullName = "John Yan";
    string newPassword = "ZYXW@123";

    // Do setup stuff (mocks/browser etc)

    // Try and set password to newPassword

    // Validate that success condition, such as navigating to new page
    // or that the password is actually updated.
}

重点是您的测试是为了确保您的生产代码符合您的要求。如果您在问题中查看示例测试,则可以看到您提供的值为newPassword。在编写测试时,您知道newPassword是否包含FullName中的相关字符。为它添加断言不会测试您的生产代码,它只是测试您是否正确连接了测试。

答案 1 :(得分:0)

没有一个断言方法,如果一个字符串包含另一个字符串的任何后续子字符串,它就会失败。但您可以使用以下代码实现此功能

  var userName = u.GetUserPassword(username));
  for (int i = 0; i < userName.Length; ++i)
    for (int j = i + 1; j < userName.Length; ++j)
      if (newPassword.Contains(userName.Substring(i, j - i)))
        Assert.Fail();

答案 2 :(得分:0)

以上标记的答案不适用于以下所有测试用例,请尝试:

np.treeposition()+"[0]"*