【发布时间】:2023-03-15 08:18:02
【问题描述】:
我可以执行存在于已使用 Rhino Mocks 模拟的抽象类上的虚拟方法的主体吗?
明确地说,我并不是要模拟虚拟方法的行为。我正在尝试 /test/ 虚拟方法(在模拟类上)。
这个想法是对 Rhino Mocks 的公然滥用吗?
【问题讨论】:
标签: c# unit-testing virtual rhino-mocks abstract
我可以执行存在于已使用 Rhino Mocks 模拟的抽象类上的虚拟方法的主体吗?
明确地说,我并不是要模拟虚拟方法的行为。我正在尝试 /test/ 虚拟方法(在模拟类上)。
这个想法是对 Rhino Mocks 的公然滥用吗?
【问题讨论】:
标签: c# unit-testing virtual rhino-mocks abstract
是的,那应该没问题。我不能说我已经尝试过了,但如果它失败了,我会感到非常惊讶。
编辑:我怀疑你想要 PartialMock 方法。这是一个例子:
using System;
using Rhino.Mocks;
public abstract class Abstract
{
public virtual int Foo()
{
return Bar() * 2;
}
public abstract int Bar();
}
class Test
{
static void Main(string[] args)
{
MockRepository repository = new MockRepository();
Abstract mock = repository.PartialMock<Abstract>();
using (repository.Record())
{
Expect.Call(mock.Bar()).Return(5);
}
Console.WriteLine(mock.Foo()); // Prints 10
}
}
编辑:或者在我第一次尝试 AAA 时:
using System;
using Rhino.Mocks;
public abstract class Abstract
{
public virtual int Foo()
{
return Bar() * 2;
}
public abstract int Bar();
}
class Test
{
static void Main(string[] args)
{
// Arrange
Abstract mock = MockRepository.GeneratePartialMock<Abstract>();
mock.Stub(action => action.Bar()).Return(5);
// Act
int result = mock.Foo();
// Assert
mock.AssertWasCalled(x => x.Bar());
// And assert that result is 10...
}
}
【讨论】:
您需要告诉 Rhino.Mocks 回调到原始实现,而不是执行它的默认行为,即拦截调用:
var mock = MockRepository.GenerateMock<YourClass>();
mock.Setup(m => m.Foo()).CallOriginalMethod(OriginalCallOptions.NoExpectation);
现在您可以在您的mock 对象上调用Foo() 方法。
【讨论】: