Pet*_*bar 1 c# nunit rhino-mocks mocking
如何使用两个签名模拟方法?
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());
}
}
Run Code Online (Sandbox Code Playgroud)
为糟糕的代码示例道歉,在IPad上这样做,但希望能给你一个想法.
参数约束还通过指定参数类型来定义方法的签名.这就是为什么他们不能被省略.
mock.Expect(x => x.MapMe(Arg<ClassB>.Is.Anything).Return(resultB);
mock.Expect(x => x.MapMe(Arg<ClassA>.Is.Anything).Return(resultA);
Run Code Online (Sandbox Code Playgroud)
我相信你遇到的另一个问题 - 你在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
}
Run Code Online (Sandbox Code Playgroud)