Rhino Mocks - используйте Expect.Call для метода с двумя сигнатурами - PullRequest
1 голос
/ 14 марта 2012

Как я могу смоделировать метод с двумя сигнатурами?

код sudo:

public Class ClassA{
  //... do stuff
}

public Class ClassB{
  //... do stuff
}

public Class BigClass
{
  public BigClass(){}

  public ClassB MapMe(ClassA a)
  {
     //... do stuff
     return new ClassB();
  }

  public ClassA MapMe(ClassB a)  
  {
     //... do stuff    
     return new ClassA();
  }
}

public Class ClassToTest
{
  public void DoSomething()
  {
     var ResultA = BigClass.MapMe(new ClassA());

     //... do some more stuff

     ResultA = BigClass.MapMe(new ClassB());
  }
}

Извиняюсь за плохой пример кода, делающий это на IPad, но, надеюсь, дает вам идею.

1 Ответ

7 голосов
/ 14 марта 2012

Просто используйте Ограничения аргумента

Ограничения аргумента также определяют сигнатуру метода путем указания типов аргументов.Вот почему они не могут быть опущены.

mock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything).Return(resultB);
mock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything).Return(resultA);

РЕДАКТИРОВАТЬ:

Я полагаю, другая проблема, с которой вы столкнулись - вы издевались BigClass без поддержки интерфейса, поэтому, очевидно, RhinoMocks не позволяет устанавливать ожидания на такой насмешке,Так что просто абстрагируйте BigClass с помощью интерфейса и макета на его основе:

public interface IMapper
{
    ClassB MapMe(ClassA entity);
    ClassA MapMe(ClassB entity);
}

public class BigClass : IMapper


[Test]
public void MapperTest()
{
    // !!! Below I've used WhenCalled() to show you that correct  
    // expectation is called based on argument type, just see in debugger
    IMapper mapperMock = MockRepository.GenerateMock<IMapper>();
    mapperMock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything))
              .WhenCalled((mi) =>
                        {
                            Debug.WriteLine("MapMe - ClassA parameter");
                        })
              .Return(null /*TODO: return correct instance*/);
    mapperMock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything))
              .WhenCalled((mi) =>
                        {
                            Debug.WriteLine("MapMe - ClassB parameter");
                        })
              .Return(null /*TODO: return correct instance*/);

    var resultB = mapperMock.MapMe(new ClassA());
    var resultA = mapperMock.MapMe(new ClassB());

   // TODO: Asserts
}
...