1

私はこのようなメソッドの単体テストを書きたいと思っています:

public override bool ChangePasswordQuestionAndAnswer(string username, string password, string newPasswordQuestion, string newPasswordAnswer)
{
    ISPMembershipUserDao userDao = GetISPMembershipUserDao();

    if (ValidateUser(username, password))
    {
        SPMembershipUser user = userDao.GetUserByUserName(username);

        user.PasswordQuestion = newPasswordQuestion;
        user.PasswordAnswer = newPasswordAnswer;

        userDao.Save(user);

        return true;
    }

    return false;
}

これは、テストするのにかなり簡単な方法です。RhinoMocksフレームワークを使用しています。しかし、1つの側面で私は自分自身に疑問を抱いています。DAOオブジェクトとそのsaveメソッドをスタブしますが、saveメソッドに渡されるユーザーオブジェクトをどれだけ深くテストする必要があるのでしょうか。そのオブジェクトのすべてのプロパティが私が期待するとおりであると断言する必要がありますか?または、PasswordQuestionプロパティとPasswordAnswerプロパティの値が正しいことだけを主張する必要がありますか?前者は、これら2つのプロパティのみが変更されており、他のプロパティは変更されていないことを確認する必要があるため、私には正しいように思われます。

何人かの方にご意見をいただければと思いました。このような状況で覚えておくべき経験則やパターンはありますか?

4

2 に答える 2

1

警告:先の個人的な意見

さて、これで邪魔になりません。私にとっては、コードが必要なロジックを適切に実装していると感じるために何をする必要があるかということになります。この場合?2つのテストケースがあります。

  • falseを返すValidateUserの処理
    • falseを返す必要があります
    • 保存は呼び出されるべきではありませんでした
  • Trueを返すValidateUserの処理
    • trueを返す必要があります
    • 保存が呼び出されるべきでした
      • 保存に渡されたオブジェクトには、変更された質問と回答があります
      • ユーザーオブジェクトの他のプロパティのチェックはありません

ただし、コードのこの部分に影響を与えるバグが提出された場合は、バグをカバーし、バグを修正して、テストを終了するために必要な(最初は失敗した)テストを追加します。

于 2009-04-22T22:58:16.953 に答える
0

ここで制約を設定するのはとても簡単なので、メソッドに副作用がないことを確認するためにそれをテストしてみませんか?

stubbedUserDao.AssertWasCalled(x => x.Save(null), o => {
        o.IgnoreArguments();
        o.Constraints(Property.AllPropertiesMatch(expectedMatchingUser));
    });
于 2009-05-22T11:23:01.140 に答える