2017-09-20 5 views
2

J'ai méthode vide:Définir nom de variable après l'exécution de la méthode dans le test Unité

this._dispatcher.PushAsync(handler, cmd); 

Après l'exécution, j'ai changé propriété de cmd:

cmd.Result = userId; 

Comment puis-je mettre en valeur de la propriété après la méthode d'exécution vide en test unitaire?

J'essaie quelque chose comme ça:

_dispatcher = new Mock<IDispatcher>(); 
_a = new Mock<SaveUserCmd>(); 
_dispatcher 
    .Setup(r => r.PushAsync(_cmdHandler, this._cmd)) 
    .Callback(() => _a.SetupProperty(y => y.Result == this._response)); 

Mais il montre ...

(Error: Expression is not a property access:y => y.Result == this._response).

SaveUserCmd:

public class SaveUserCmd 
{ 
    public string FirstName { get; set; } 

    public string LastName { get; set; } 

    public object Result { get; set; } 
} 

IDispatcher:

public interface IDispatcher 
{ 
    Task PushAsync<TCommand>(ICommandHandlerAsync<TCommand> commandHandlerAsync, TCommand message); 
} 
+0

Qu'est-ce que "is whrong" signifie? Toute exception? Comportement inattendu – HimBromBeere

Répondre

2

Vous devez d'abord affecter une valeur au rappel. == n'attribue pas de valeur c'est une comparaison d'égalité.

Deuxièmement pas besoin de se moquer du modèle. Créez simplement une instance et utilisez-la. Vous pouvez toujours y accéder dans le rappel via les paramètres.

Troisièmement, comme la méthode à se moquer est asynchrone, vous devez renvoyer une tâche pour que le code puisse circuler jusqu'à la fin.

//Arrange 
var dispatcher = new Mock<IDispatcher>(); 
var cmd = new SaveUserCmd(); 
var userId = "some value here"; 
dispatcher.Setup(r => r.PushAsync(_cmdHandler, cmd)) 
    .Callback((ICommandHandlerAsync<SaveUserCmd> h, SaveUserCmd c) => c.Result = userId)) 
    .Returns(Task.FromResult((object)null)); 
0

_a.SetupProperty sera mis en place la propriété de la _a maquette qui est pas ce que vous voulez faire (en général, est plus tard se moque d'initialisation jamais l'approche correcte). Au lieu de cela, vous souhaitez simplement attribuer une valeur à une propriété de l'objet réel.

Vous pouvez facilement le faire en .Callback() qui a aussi les surcharges qui vous donnera l'exemple exact qui a été transmis à l'appel de la méthode moquée

_dispatcher 
    .Setup(r => r.PushAsync(It.IsAny<ICommandHandlerAsync<SaveUserCmd>>(), It.IsAny<SaveUserCmd>())) 
    .Callback((handler, cmd) => { 
     cmd.Result = "static result"; 
    }); 

Cette mise en place appel de méthode accepte maintenant des arguments valables et juste définit le résultat de la commande passée sur un résultat fixe. Ainsi, vous pouvez facilement tester si la chose réellement testée appelle correctement l'objet Dispatcher.