Pergunta

Estou recebendo este erro ao tentar definir um mock ter PropertyBehavior():

System.InvalidOperationException: System.InvalidOperationException: chamada inválido, a última chamada foi utilizado ou nenhuma chamada foi feita (certifique-se que você está chamando uma virtual (C #) / Overridable (VB) Método) ..

Eu estou tentando usar somente Rhino Mocks 3,5 (Organizar, Agir , Assert)

Aqui está o meu código:

    private IAddAddressForm form;

    private AddAddressMediator mediator;

    [TestInitialize()]
    public void MyTestInitialize()
    {
        form = MockRepository.GenerateMock<IAddAddressForm>();
        mediator = new AddAddressMediator(form);


        // Make the properties work like a normal property
        Expect.Call(form.OKButtonEnabled).PropertyBehavior();

        //I tried this too.  I still get the exception
        //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();
    }


    [TestMethod]
    public void TestOKButtonEnabled()
    {

        form.OKButtonEnabled = true;
        Assert.IsTrue(form.OKButtonEnabled);
    }

Eu sei que eu poderia usar um esboço sobre (e para o código acima eu deveria), mas eu estou tentando aprender Rhino Mocks.

Eventualmente, eu quero ser capaz de se certificar de que várias propriedades tem seus valores acessado. (Alguma dica sobre como verificar que form.FirstName foi acessado (ou seja, o getter foi chamado) também seria apreciada.)

Caso seja necessário, aqui está o código para IAddressForm:

namespace AddressBook
{
    public interface IAddAddressForm
    {
        string FirstName { get; set; }
        string LastName { get; set; }
        string Address1 { get; set; }
        string State { get; set; }
        string Address2 { get; set; }
        string ZipCode { get; set; }
        string City { get; set; }
        bool OKButtonEnabled { get; set; }
    }
}

De qualquer forma, eu pensei que virtual não seria um problema como eu estou passando em uma interface, mas estou claramente faltando alguma coisa.

Foi útil?

Solução

PropertyBehavior nunca usou antes, mas esta é a sintaxe que você está procurando?

form.Stub(x=>x.OKButtonEnabled).PropertyBehavior()

Rhino Mocks funciona completamente através de métodos de extensão agora. A chamada só estática I cada make any more é MockRepository.GenerateStub.

Outras dicas

Você mencionou usando um esboço em vez de um mock mas antes de ir mudando-o eu notar que, estranhamente, eu recebo a exceção inválida Chamada quando eu usei GenerateStub mas não quando eu uso GenerateMock.

View = MockRepository.GenerateStub<IAddressView>();
View.Stub(v => v.Message).PropertyBehavior();

Esta lança a exceção de chamada inválido e sim, IAddressView.Message tem um getter e setter.

Recebi este erro quando tentei definir uma expectativa sobre um método não-virtual.

mockedObject.Expect(a => a.NonVirtualMethod()).Returns(null);

O erro foi embora quando eu fiz NonVirtualMethod virtual.

Eu acho que você tem que fazer MockRepository.ReplyAll () depois de configurar todas as expectativas e antes de começar a utilizar este simulada. Então, meu palpite no seu caso é que você tem que mover a linha Expect.Call antes mediador = new AddAddressMediator (forma) ;, e ficar a responder a todos logo depois que:

[TestInitialize()]
public void MyTestInitialize()
{
    form = MockRepository.GenerateMock<IAddAddressForm>();
    // Make the properties work like a normal property
    Expect.Call(form.OKButtonEnabled).PropertyBehavior();

    //I tried this too.  I still get the exception
    //SetupResult.For(form.OKButtonEnabled).PropertyBehavior();

    MockRepository.ReplyAll();
    mediator = new AddAddressMediator(form);



}

Eu corri para este problema quando eu estava tentando chamar uma propriedade internal (getter apenas) em um objeto em C #. Neste caso, acrescentando .PropertyBehavior() não ajuda.

Meu solução foi extrair a lógica para fora da propriedade e em um método interno que I depois injectado dependências para este método (como parâmetros).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top