Vérifiez la valeur du paramètre de référence Moq
Je viens de passé à Moq et ont couru dans un problème. Je me suis mise à l'essai d'une méthode qui crée une nouvelle instance d'un objet de l'entreprise, de définir les propriétés de l'objet de la saisie de l'utilisateur les valeurs et les appels de méthode (SaveCustomerContact ) pour enregistrer le nouvel objet. L'objet de l'entreprise est passé comme un argument ref parce qu'il passe par un accès distant de la couche. J'ai besoin de tester que l'objet est transmis à SaveCustomerContact a toutes ses propriétés définie comme prévu, mais parce qu'il est instancié en tant que nouvelle méthode du contrôleur je n'arrive pas à le faire.
public void AddContact() {
var contact = new CustomerContact() { CustomerId = m_model.CustomerId };
contact.Name = m_model.CustomerContactName;
contact.PhoneNumber = m_model.PhoneNumber;
contact.FaxNumber = m_model.FaxNumber;
contact.Email = m_model.Email;
contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
contact.EmailFlag = m_model.EmailFlag;
contact.FaxFlag = m_model.FaxFlag;
contact.PostalMailFlag = m_model.PostalMailFlag;
contact.CustomerLocationId = m_model.CustomerLocationId;
RemotingHandler.SaveCustomerContact( ref contact );
}
Voici le test:
[TestMethod()]
public void AddContactTest() {
int customerId = 0;
string name = "a";
var actual = new CustomerContact();
var expected = new CustomerContact() {
CustomerId = customerId,
Name = name
};
model.Setup( m => m.CustomerId ).Returns( customerId );
model.SetupProperty( m => model.CustomerContactName, name );
model.SetupProperty( m => m.PhoneNumber, string.Empty );
model.SetupProperty( m => m.FaxNumber, string.Empty );
model.SetupProperty( m => m.Email, string.Empty );
model.SetupProperty( m => m.ReceiveInvoiceFlag, false );
model.SetupProperty( m => m.ReceiveStatementFlag, false );
model.SetupProperty( m => m.ReceiveContractFlag, false );
model.SetupProperty( m => m.EmailFlag, false );
model.SetupProperty( m => m.FaxFlag, false );
model.SetupProperty( m => m.PostalMailFlag, false );
model.SetupProperty( m => m.CustomerLocationId, 0 );
remote
.Setup( r => r.SaveCustomerContact( ref actual ) )
.Callback( () => Assert.AreEqual( actual, expected ) );
target.AddContact();
}
C'est juste la plus récente de nombreuses tentatives pour obtenir ahold de ce paramètre. Pour référence, la valeur réelle ne change pas sa valeur initiale (construits) de l'état.
Déplacement de l'Affirmer.AreEqual(attendus, réel) après l'objectif de l'appel échoue. Si je peux ajouter .Vérifiables() pour le programme d'installation à la place de la .Rappel et ensuite appeler à distance.Vérifiez une fois que la cible (ou, je suppose, jeu de la fantaisie à une stricte), il échoue toujours, car le paramètre-je fournir à l'essai n'est pas de la même instance que celle qui est créée dans la méthode de contrôleur.
Je suis en utilisant Moq 3.0.308.2. Toutes les idées sur la façon de tester ce serait apprécié. Merci!
Vous devez vous connecter pour publier un commentaire.
Je ne peux pas vous offrir une solution exacte, mais une autre solution serait de cacher le pass-by-ref sémantique derrière un adaptateur, qui prend le paramètre par valeur et la transmet à la RemotingHandler. Ce serait plus facile pour s'en moquer, et de supprimer l' "ref" verrue de l'interface (je suis toujours méfié de réf paramètres 🙂 )
EDIT:
Ou vous pouvez utiliser un tampon à la place d'une maquette, par exemple:
Vous pouvez maintenant examiner les sauvés objet dans votre test:
Vous dites aussi dans votre commentaire:
Je pense que c'est exactement le précédent, vous devez définir le! Si votre code n'est pas testable, vous allez garder du mal à le tester. Rendre plus facile à tester, et d'augmenter votre couverture.
La dernière version de Moq prend en charge ce scénario.
Prises à partir du démarrage à http://code.google.com/p/moq/wiki/QuickStart:
Malheureusement, je ne suis pas sûr que ce soit possible sans le soutien direct de Moq. Le problème est que les expressions Lambda ne supportent pas les ref ou à l'extérieur.
http://msdn.microsoft.com/en-us/library/bb397687.aspx
Je ne peux même pas obtenir un exemple comme la vôtre travail. L'ajout de ref pour le programme d'installation ne parvient pas à compiler.
Vous voudrez peut-être consulter le Moq discussions pour plus d'
http://groups.google.com/group/moqdisc
Bonne chance.
J'ai rencontré de problème similaire. Peu, j'ai eu la solution à l'aide de la dernière Moq et le dépassement de la valeur comme
var instance = new Bar();
Se moquer.Le programme d'installation(foo => foo.Soumettre(réf exemple)).Retourne(true);
Précédemment, j'ai été en utilisant la même méthode, mais je n'étais pas de retour comme vrai.
À l'intérieur de la fonction réelle de l'instance a été se créé et l'écrasement de l'instance passée de l'unité de la classe de test a été à l'origine du problème. J'ai enlevé la création de l'instance à l'intérieur de la classe réelle et puis il a travaillé.
Espère que ça va vous aider.
grâce