【发布时间】:2014-09-02 08:49:35
【问题描述】:
我有一个测试(代码如下)来测试 Method1 调用 Method2。我得到的例外是
当前代理生成器无法拦截指定的方法 原因如下: - 无法拦截密封方法。
被测方法本身并未密封。但是,它确实对密封类有 依赖 (我无法为其创建包装器以正确模拟它的第三方类 - 另一个问题的另一个主题)。无论哪种方式,此时我并不是要 FakeItEasy 模拟密封类。在调试我的测试时,当调用依赖项时,我可以清楚地看到正在生成一个真实的对象,而不是假的。
然而,鉴于错误消息,我觉得它可能以某种方式相关。
此外,我通过random blog post 发现,将方法设为虚拟可以解决问题,从而使测试通过。我试了一下,它奏效了。但我不明白 为什么 它修复了它,无论如何,让方法保持虚拟对我来说没有意义。就我而言,被测试的班级没有自己的孩子,即;没有孩子可以覆盖它的方法,所以我看不出有什么理由让它成为虚拟的。
我认为我没有理由将方法设为虚拟是不是错了?
FakeItEasy 是否以某种方式试图模拟那个密封类?
我真的不确定如何进行此测试。
我的测试
[SetUp]
public void SetUp()
{
// Arrange
_service2 = A.Fake<Service2>(x => x.WithArgumentsForConstructor(
() => new Service2()));
_service1 = A.Fake<Service1>(x => x.WithArgumentsForConstructor(
() => new Service1(_service2)));
}
[Test]
public void when_Method1_executes_it_calls_Method2()
{
// Act
result = _service1.Method1();
// Assert
A.CallTo(() => _service2.Method2())
.WithAnyArguments()
.MustHaveHappened();
}
相关方法
public class Service1 : IService1
{
private readonly IService2 _service2;
public Service1(IService2 service2)
{
_service2 = service2;
}
public bool Method1()
{
using (var dependency = new MyDependency()) // third party sealed class
{
}
var x = _service2.Method2();
}
}
public class Service2 : IService2
{
public bool Method2() // making this virtual fixes the FakeItEasy exception
{
}
}
【问题讨论】:
标签: c# asp.net-mvc testing fakeiteasy