Quelle est la principale différence entre ces deux façons de donner à une méthode une fausse implémentation? J'utilisais la deuxième manière très bien dans un test mais dans un autre test, le comportement ne peut pas être atteint à moins que je ne parte de la première façon.Différence dans les techniques de définition de la valeur de retour d'une méthode stubbed avec Rhino Mocks
si (la première),
using (test.Record()) //test is MockRepository instance
{
service.GetUser("dummyName");
LastCall.Return(new LoginUser());
}
vs (la seconde).
service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser());
Modifier
Le problème est que la deuxième technique renvoie null dans le test, quand je pense à retourner une nouvelle LoginUser. La première technique se comporte comme prévu en retournant un nouveau LoginUser. Tous les autres codes de test utilisés dans les deux cas sont identiques.
[TestFixture]
public class AuthorizationTest
{
private MockRepository test;
private IMembershipService service;
[SetUp]
public void SetUp()
{
test = new MockRepository();
service = test.Stub<IMembershipService>();
using (test.Record())
{
service.GetUser("dummyName");
LastCall.Return(new LoginUser());
}
//service.Stub(r => r.GetUser("dummyName")).Return(new LoginUser());
}
[Test]
public void GetCurrentUser_UserIsAuthenticated_ReturnsCurrentUser()
{
var authStub = new AuthorizationStub_SetCurrentUserAuthenticated(service, true);
LoginUser u = authStub.GetCurrentUser();
Assert.That(u != null);
}
[TearDown]
public void TearDown()
{
service = null;
test = null;
}
}
Pourrait-il être quelque chose à voir avec la surcharge de l'interface peut-être?
public interface IMembershipService
{
bool ChangePassword(string username, string oldPassword, string newPassword);
LoginUser GetUser(string username);
LoginUser GetUser(object providerUserKey);
string ResetPassword(string username);
bool ValidateUser(string username, string password);
}
La ligne origine du problème dans la méthode à l'essai est:
LoginUser currentUser = _repository.GetUser(identity.Name);
En mode débogage, identity.Name est jamais nul et est toujours « dummyName »
Ok, merci. J'ai ajouté quelques informations supplémentaires. – CRice
mis à jour ma réponse avec quelques autres idées ... –
Merci pour les exemples. C'est bizarre, le test échoue encore à moins qu'il n'y ait la présence du talon avec record et lastcall. Lorsque ce talon est là ET j'inclue également votre service.Expect et service.VerifyAllExpectations il passe. Si j'échange le talon d'enregistrement et lastcall avec votre exemple de talon, il échoue. – CRice