Rhino Mocks-使用Expect.调用一个具有两个签名的方法

本文关键字:两个 方法 使用 调用 Mocks- 一个 Rhino Expect | 更新日期: 2023-09-27 18:27:37

如何模拟具有两个签名的方法?

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上这样做的糟糕代码示例,我深表歉意,但希望能给你这个想法。

Rhino Mocks-使用Expect.调用一个具有两个签名的方法

只需使用参数约束

参数约束还通过指定参数类型。这就是为什么它们不能被省略的原因。

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
}