J'ai un test comme celui-ci:
[TestCase("~/page/myaction")]
public void Page_With_Custom_Action(string path) {
// Arrange
var pathData = new Mock<IPathData>();
var pageModel = new Mock<IPageModel>();
var repository = new Mock<IPageRepository>();
var mapper = new Mock<IControllerMapper>();
var container = new Mock<IContainer>();
container.Setup(x => x.GetInstance<IPageRepository>()).Returns(repository.Object);
repository.Setup(x => x.GetPageByUrl<IPageModel>(path)).Returns(() => pageModel.Object);
pathData.Setup(x => x.Action).Returns("myaction");
pathData.Setup(x => x.Controller).Returns("page");
var resolver = new DashboardPathResolver(pathData.Object, repository.Object, mapper.Object, container.Object);
// Act
var data = resolver.ResolvePath(path);
// Assert
Assert.NotNull(data);
Assert.AreEqual("myaction", data.Action);
Assert.AreEqual("page", data.Controller);
}
GetPageByUrl
s'exécute deux fois dans mon DashboardPathResolver
, comment dire à Moq de revenir null
la première fois et pageModel.Object
la seconde?
c#
unit-testing
nunit
moq
marcus
la source
la source
SetupSequence()
ne fonctionne pas avecCallback()
. Si c'était le cas, on pourrait vérifier les appels à la méthode simulée à la manière d'une "machine d'état".SetupSequence
ne fonctionne que pour deux appels, mais que puis-je faire si j'ai besoin de plus de deux appels?SetupSequence
peut être utilisé pour un nombre arbitraire d'appels. Le premier exemple que j'ai donné renvoie une séquence de 5 appels.Les réponses existantes sont excellentes, mais je pensais que je mettrais mon alternative qui utilise simplement
System.Collections.Generic.Queue
et ne nécessite aucune connaissance particulière du cadre de simulation - car je n'en avais pas quand je l'ai écrit! :)Ensuite...
la source
Exception
comme vous ne pouvez pasEnqueue
. MaisSetupSequence
cela fonctionnera (voir la réponse de @stackunderflow par exemple).Dequeue()
au lieu de justeDequeue
, vous auriez raison.L'ajout d'un rappel n'a pas fonctionné pour moi, j'ai plutôt utilisé cette approche http://haacked.com/archive/2009/09/29/moq-sequences.aspx et je me suis retrouvé avec un test comme celui-ci:
la source
Vous pouvez utiliser un rappel lors de la configuration de votre faux objet. Jetez un œil à l'exemple du Wiki Moq ( http://code.google.com/p/moq/wiki/QuickStart ).
Votre configuration pourrait ressembler à ceci:
la source
Setup()
appel, etReturn()
une valeur différente.Vous pouvez maintenant utiliser SetupSequence. Voir cet article: http://codecontracts.info/2011/07/28/moq-setupsequence-is-great-for-mocking/
la source
Atteint ici pour le même type de problème avec des exigences légèrement différentes.
J'ai besoin d'obtenir différentes valeurs de retour de mock basées sur différentes valeurs d'entrée et trouvé une solution qui IMO est plus lisible car elle utilise la syntaxe déclarative de Moq (linq to Mocks).
la source
da.GetFromDb(0) == new Account { ..None.. && da.GetFromDb(1) == new Account { InActive } && ...
, aucunIt.Is
-lambda requis du tout.La réponse acceptée , ainsi que la réponse SetupSequence , gère le retour des constantes.
Returns()
contient des surcharges utiles où vous pouvez renvoyer une valeur basée sur les paramètres qui ont été envoyés à la méthode simulée. Basé sur la solution donnée dans la réponse acceptée, voici une autre méthode d'extension pour ces surcharges.Malheureusement, l'utilisation de la méthode vous oblige à spécifier certains paramètres de modèle, mais le résultat est encore assez lisible.
Créer des surcharges pour la méthode d'extension avec plusieurs paramètres (
T2
,T3
, etc.) , si nécessaire.la source