C# 4.0 Rhino模拟默认返回类型?

C# 4.0 Rhino模拟默认返回类型?,c#-4.0,rhino-mocks,C# 4.0,Rhino Mocks,如果您没有显式指定返回值(我知道您应该始终指定返回,但这是另一个问题),那么当返回类型是接口时,为什么Rhino Mocks(v3.6)会生成代理类型 许多web文章,甚至一些文章,都说模拟将返回默认类型作为其结果,我假设default(T)。我没有看到这种行为(见下文)。我在网上也找不到任何能说明这种行为的东西 我还使用整数类型和类作为返回类型进行了测试(类似于下面),当我尝试调用Act代码中的方法时,这两个测试都会抛出异常“需要返回值或要抛出的异常”。这一点我不介意,这显然是错的,犀牛并没有

如果您没有显式指定返回值(我知道您应该始终指定返回,但这是另一个问题),那么当返回类型是接口时,为什么Rhino Mocks(v3.6)会生成代理类型

许多web文章,甚至一些文章,都说模拟将返回默认类型作为其结果,我假设
default(T)
。我没有看到这种行为(见下文)。我在网上也找不到任何能说明这种行为的东西

我还使用整数类型和类作为返回类型进行了测试(类似于下面),当我尝试调用Act代码中的方法时,这两个测试都会抛出异常“需要返回值或要抛出的异常”。这一点我不介意,这显然是错的,犀牛并没有“变得有创造力”,尽管它在我看来是变化无常的

// Arrange
IFoo strictMockInstance = MockRepository.GenerateStrictMock<IFoo>();
IFoo dynamicMockInstance = MockRepository.GenerateMock<IFoo>();

strictMockInstance.Expect(call => call.Bar());
strictMockInstance.Replay();

dynamicMockInstance.Expect(call => call.Bar());
dynamicMockInstance.Replay();

// Act
IResult smResult = strictMockInstance.Bar();
IResult dmResult = dynamicMockInstance.Bar();

// Assert    
Assert.IsNull(smResult); // none of these results are null, both are proxy instances
Assert.IsNull(dmResult);

// ....
public interface IFoo 
{
    IResult Bar();
}

public interface IResult { }
//排列
IFoo strictMockInstance=MockRepository.GenerateStrictMock();
IFoo dynamicMockInstance=MockRepository.GenerateMock();
Expect(call=>call.Bar());
strictMockInstance.Replay();
Expect(call=>call.Bar());
dynamicLockInstance.Replay();
//表演
IResult smResult=strictMockInstance.Bar();
IResult dmResult=dynamicLockInstance.Bar();
//断言
Assert.IsNull(smResult);//这些结果都不是null,都是代理实例
Assert.IsNull(dmResult);
// ....
公共接口IFoo
{
i结果条();
}
公共接口IResult{}

此功能背后的主要原因是支持(或处理)层次结构

考虑以下几点:

var mock = MockRepository.GenerateMock<ISomeInterface>();
mock.Expect(x => x.Document.Header.CreateRow());
var mock=MockRepository.GenerateMock();
Expect(x=>x.Document.Header.CreateRow());
当Rhino Mocks遇到作为接口的返回类型时,它将检查是否已经创建了一个模拟。如果没有找到一个,它将动态创建一个,以防止空异常

Offtopic,
Expect()/Call()
不是您在源代码注释中提到的AAA语法,请改用
AssertWasCall()
方法