Dada a seguinte interface:
public interface IFoo
{
bool Foo(string a, bool b = false);
}
Tentando zombar dele usando o Moq:
var mock = new Mock<IFoo>();
mock.Setup(mock => mock.Foo(It.IsAny<string>())).Returns(false);
fornece o seguinte erro no tempo de compilação:
Uma árvore de expressão pode não conter uma chamada ou invocação que use argumentos opcionais
Eu encontrei o problema acima levantado como um aprimoramento na lista de problemas do Moq e ele parece estar atribuído à versão 4.5 (sempre que houver).
Minha pergunta é: o que devo fazer, pois o que foi dito acima não será corrigido tão cedo? Minhas opções são apenas definir explicitamente o valor padrão do parâmetro opcional toda vez que eu o zoo (o que meio que anula o ponto de especificar um em primeiro lugar) ou criar uma sobrecarga sem o bool (como o que eu teria feito antes de C # 4)?
Ou alguém encontrou uma maneira mais inteligente de superar esse problema?
fonte
Respostas:
Acredito que sua única opção agora é incluir explicitamente o
bool
parâmetro na configuração deFoo
.Eu não acho que isso anula o propósito de especificar um valor padrão. O valor padrão é uma conveniência para chamar código, mas acho que você deve ser explícito em seus testes. Digamos que você possa deixar de especificar o
bool
parâmetro. O que acontece se, no futuro, alguém alterar o valor padrão deb
paratrue
? Isto levará a testes de falha (e com razão), mas eles vão ser mais difíceis de correção por causa da suposição oculto queb
éfalse
. A especificação explícita dobool
parâmetro tem outro benefício: melhora a legibilidade dos seus testes. Alguém que passar por eles saberá rapidamente que há umaFoo
função que aceita dois parâmetros. Esses são meus 2 centavos, pelo menos :)Quanto a especificá-lo toda vez que você o zomba, não duplique o código: crie e / ou inicialize o mock em uma função, para que você tenha apenas um único ponto de mudança. Se você realmente deseja, pode superar a aparente falha do Moq aqui duplicando
Foo
os parâmetros nesta função de inicialização:fonte
if (!x) {} else {}
anti-padrão :)Acabei de encontrar esse problema hoje, o Moq não suporta esse caso de uso. Portanto, parece que substituir o método seria suficiente para este caso.
Agora os dois métodos estão disponíveis e este exemplo funcionaria:
fonte
Usando o Moq versão 4.10.1, consegui fazer o seguinte
Com interface:
E simulado
Resolve uma chamada para Foo com o primeiro parâmetro ok
fonte