Eu tenho um teste como este:
[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
executa duas vezes no meu DashboardPathResolver
, como posso dizer ao Moq para retornar null
na primeira e pageModel.Object
na segunda?
c#
unit-testing
nunit
moq
Marcus
fonte
fonte
SetupSequence()
não funciona comCallback()
. Se isso acontecesse, era possível verificar as chamadas para o método simulado de uma maneira "máquina de estado".SetupSequence
funciona apenas para duas chamadas, mas o que posso fazer se precisar de mais de duas chamadas?SetupSequence
pode ser usado para um número arbitrário de chamadas. O primeiro exemplo que eu dei retorna uma sequência de 5 chamadas.As respostas existentes são ótimas, mas pensei em lançar minha alternativa que apenas usa
System.Collections.Generic.Queue
e não requer nenhum conhecimento especial da estrutura de zombaria - já que eu não tinha nenhuma quando a escrevi! :)Então...
fonte
Exception
como não podeEnqueue
. MasSetupSequence
funcionará (veja a resposta do @stackunderflow, por exemplo).Dequeue()
vez de apenasDequeue
, você estaria correto.A adição de um retorno de chamada não funcionou para mim. Em vez disso, usei essa abordagem http://haacked.com/archive/2009/09/29/moq-sequences.aspx e terminei com um teste como este:
fonte
Você pode usar um retorno de chamada ao configurar seu objeto simulado. Veja o exemplo do Moq Wiki ( http://code.google.com/p/moq/wiki/QuickStart ).
Sua configuração pode ficar assim:
fonte
Setup()
ligação novamente e comReturn()
um valor diferente.Agora você pode usar o SetupSequence. Veja este post: http://codecontracts.info/2011/07/28/moq-setupsequence-is-great-for-mocking/
fonte
Chegou aqui para o mesmo tipo de problema com requisitos ligeiramente diferentes.
Preciso obter diferentes valores de retorno do mock com base em diferentes valores de entrada e encontrar uma solução que IMO seja mais legível, pois usa a sintaxe declarativa do Moq (linq to Mocks).
fonte
da.GetFromDb(0) == new Account { ..None.. && da.GetFromDb(1) == new Account { InActive } && ...
, semIt.Is
-ambda necessário.A resposta aceita , bem como a resposta SetupSequence , lida com as constantes retornadas.
Returns()
possui algumas sobrecargas úteis em que você pode retornar um valor com base nos parâmetros que foram enviados para o método simulado. Com base na solução dada na resposta aceita, aqui está outro método de extensão para essas sobrecargas.Infelizmente, o uso do método requer que você especifique alguns parâmetros do modelo, mas o resultado ainda é bastante legível.
Criar sobrecargas para o método de extensão com vários parâmetros (
T2
,T3
, etc.), se necessário.fonte