MoQ hoe in te stellen voor meerdere oproepen van dezelfde methode

Ik heb problemen bij het instellen van de nep om te falen als de gebruiker drie keer heeft geprobeerd in te loggen met een fout. Mijn code ziet er als volgt uit:


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

Ervan uitgaande dat mijn repository er ongeveer zo uitziet:

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);
}

waardeer alle tips en zou dol zijn op de moq syntax in VB.Net ;-)

De LoginBo-code is als:

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 antwoord

Ok, nu heb ik precies wat je wilt doen. dus negeer wat ik schreef vóór de bewerking.

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)

In 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
toegevoegd
Wie roept de methode LockAccount aan? logInBO? en wie verandert de waarde IsAccountLocked ? (ik denk dat het hier het object is dat IUserLoginRepository zelf implementeert)
toegevoegd de auteur eyossi, de bron
Kun je LogicBO-code toevoegen?
toegevoegd de auteur eyossi, de bron
voeg het toe aan uw vraag, zodat het leesbaar is
toegevoegd de auteur eyossi, de bron
update het antwoord
toegevoegd de auteur eyossi, de bron
update het ... kijk eens
toegevoegd de auteur eyossi, de bron
Hallo eyossi, bedankt voor de post. dit lijkt echter niet goed. logInBo.Setup ?? loginBo is mijn klasse die getest wordt en ik wil het niet bespotten. Wat ik wil is als de gebruiker 3 keer probeert in te loggen en faalt, dan wordt de Repository LockAccount aangeroepen. Ik zou moeten kunnen verifiëren dat LockAccount wordt aangeroepen en AccountIsLocked is waar. Kun je alsjeblieft je code bijwerken, zodat de dingen duidelijk worden? Ik wilde gewoon wat code om het 'TODO'-dingo in mijn bovenstaande testfunctie te vullen.
toegevoegd de auteur user1477660, de bron
nou ja, het is LogInBo die de LogInRepository als bouwafhankelijkheid krijgt die ik probeer te bespotten. ... De code in in LoginBo ziet eruit als:
toegevoegd de auteur user1477660, de bron
public bool LogIn (string userName, string password) {if (_logInRepo.IsAccountLocked)//TODO log error return false; if (_logInRepo.LogInUser (gebruikersnaam, wachtwoord)) {return true; } else {if (_logInRepo.FailedAttempts (userName) == 3)//dit moet de mislukte pogingen verhogen en de waarde _logInRepo.LockAccount (userName) retourneren; }//Log-fout return false; } '
toegevoegd de auteur user1477660, de bron
lijkt niet op het formatteren van de code ;-)
toegevoegd de auteur user1477660, de bron
heeft de vraag bijgewerkt ...
toegevoegd de auteur user1477660, de bron
je code compileert helemaal niet ... misschien zet je je code in C# of wat dan ook dat voor jou werkt ...
toegevoegd de auteur user1477660, de bron

Het lijkt mij dat LoginRepo is wat je wilt bespotten. U stelt uw mock-repository zo in dat deze een gebruiker retourneert die zich al tweemaal heeft aangemeld, roept LoginBo aan met slechte referenties en controleert vervolgens of de account is vergrendeld in de Mock-repository.

Ter verduidelijking, om de situatie te testen dat u zich niet driemaal aanmeldt, roept u LoginBo 3 keer niet aan; je noemt het een keer met een setup die al klaar is voor falen.

0
toegevoegd