MoQ同じメソッドの複数の呼び出しを設定する方法

ユーザーが失敗して3回ログインしようとした場合、失敗するように模擬を設定する際に問題があります。私のコードは次のようになります:


Public Sub User_LogIn_With_Three_Failed_Attempts_AccountLocks_Pass()
    ' arrange
    Dim logInMock As New Moq.Mock(Of IUserLoginRepository)()
    logInMock.Setup(Function(repo) repo.LogInUser(It.IsAny(Of String), It.IsAny(Of String))).Returns(False)
    ' Todo: have to instruct the mock that if it is repeated 3 times then lock the account. How to do this????

    ' act
    Dim logInBO As New LogInBO(logInMock.Object)
    logInBO.LogIn("someusername", "someWrongPassword")
    logInBO.LogIn("someusername", "someWrongPassword")
    logInBO.LogIn("someusername", "someWrongPassword")

    ' verify
    logInMock.Verify(Function(r) r.LogInUser("someusername", "someWrongPassword"), times:=Times.Exactly(3))
    logInMock.Verify(Function(r) r.IsAccountLocked = True)
End Sub

私のリポジトリが次のようになっていると仮定します:

public interface IUserLoginRepository
{
    bool LogInUser(string userName, string password);
    bool IsAccountLocked { get; }
    bool ResetPassword(string userName, string password);
    int FailedAttempts(string userName);
    bool LockAccount(string userName);
}

任意のヒントに感謝し、VB.Netでのmoq構文が好きです;-)

LoginBoコードは次のようなものです:

public bool LogIn(string userName, string password)
    {
        if (_logInRepo.IsAccountLocked)
           //TODO log error
            return false;

        if (_logInRepo.LogInUser(userName, password))
        {
            return true;
        }
        else
        {
            if (_logInRepo.FailedAttempts(userName) == 3)//this should increment the failed attempts and return the value
                _logInRepo.LockAccount(userName);
        }

       //Log error
        return false;
    }
0

2 答え

さて、あなたは何をしたいのかが分かりました。編集前に書いたものは無視してください。

Dim logInMock As New Moq.Mock(Of IUserLoginRepository)()

Dim IsAccountLocked = false

logInMock.SetupGet(Function(repo) repo.IsAccountLocked).Returns(Function() { return isAccountLocked })


dim amountOfFailedlogIns = 0;
logInMock.Setup(Function(repo) repo.LogInUser(It.IsAny(Of String), It.IsAny(Of String))).Callback(Function(repo) amountOfFailedlogIns++).Returns(False)

logInMock.Setup(Function(repo) repo.FailedAttempts(It.IsAny(Of String))).Returns(Function(repo) return amountOfFailedlogIns)

C#では:

Mock logInMock = new Mock();

bool IsAccountLocked = false

logInMock.SetupGet(repo => repo.IsAccountLocked).Returns(() => { return isAccountLocked; })


int amountOfFailedlogIns = 0;
logInMock.Setup(repo => repo.LogInUser(It.IsAny(), It.IsAny()))).Callback(repo => { amountOfFailedlogIns++; }).Returns(false);

logInMock.Setup(repo => repo.FailedAttempts(It.IsAny()).Returns(repo => { return amountOfFailedlogIns; })
1
追加された
誰が LockAccount メソッドを呼び出しますか? logInBO?誰が IsAccountLocked の値を変更しますか? (私はここにそれがIUserLoginRepository自体を実装するオブジェクトだと思います)
追加された 著者 eyossi,
LogicBOコードを追加できますか?
追加された 著者 eyossi,
読めるようにあなたの質問にそれを加えてください
追加された 著者 eyossi,
答えを更新しました
追加された 著者 eyossi,
それを更新しました...見てみましょう
追加された 著者 eyossi,
こんにちは、eyossi、ポストのおかげで。しかし、これは右のようには思われません。 logInBo.Setup ?? loginBoはテスト対象のクラスであり、私はそれを嘲笑したくありません。ユーザーが3回ログインしようとして失敗し、リポジトリのLockAccountが呼び出された場合、私が欲しいのはこれです。 LockAccountが呼び出され、AccountIsLockedがtrueであることを確認できるはずです。物事を明確にするためにコードを更新していただけますか?私は上記のテスト機能でTODOのことを記入するコードをほしいと思っていました。
追加された 著者 user1477660,
LogInBoはLogInRepositoryを構築依存として取得していますが、私は偽を試みています。 ... LoginBoのコードは以下のようになります:
追加された 著者 user1477660,
public boolean LogIn(string userName、string password){if(_logInRepo.IsAccountLocked)// TODOログエラーがfalseを返します。 if(_logInRepo.LogInUser(userName、password)){trueを返します。 } else {if(_logInRepo.FailedAttempts(userName)== 3)//失敗した試行をインクリメントし、_logInRepo.LockAccount(userName)の値を返す必要があります。 } //ログエラーはfalseを返します。 } '
追加された 著者 user1477660,
コードの書式設定のようには見えません;-)
追加された 著者 user1477660,
質問を更新しました...
追加された 著者 user1477660,
あなたのコードはまったくコンパイルされません...おそらくあなたのコードをC#に入れてください。
追加された 著者 user1477660,

LoginRepo はあなたが模擬したいものです。すでに2回ログインに失敗したユーザーを返すように偽のリポジトリを設定し、不正な資格情報でLoginBoを呼び出し、アカウントがMockリポジトリにロックされていることを確認します。

3回ログインに失敗した状況をテストするために、LoginBoに3回は電話をかけないでください。すでに失敗の準備が整っているセットアップで一度呼びます。

0
追加された