我有以下(这里是简化的)代码,我想用FakeItEasy进行测试。
public class ActionExecutor : IActionExecutor
{
public void TransactionalExecutionOf(Action action)
{
try
{
// ...
action();
// ...
}
catch
{
// ...
Rollback();
}
}
public void Commit()
{ }
public void Rollback()
{ }
}
public class Service : IService
{
private readonly IRepository _repository;
private readonly IActionExecutor _actionExecutor;
// ctor for CI
public void ServiceMethod(string name)
{
_actionExecutor.TransactionalExecutionOf(() =>
{
var item = _repository.FindByName(ItemSpecs.FindByNameSpec(name));
if (item == null) throw new ServiceException("Item not found");
item.DoSomething();
_actionExecutor.Commit();
}
}
}
我想测试是否ServiceException
被抛出,所以我像这样设置我的测试
var repo = A.Fake<IRepository>();
A.CallTo(() => repo.FindByName(A<ISpec<Item>>.Ignored))
.Returns(null);
var executor = A.Fake<IActionExecutor>();
executor.Configure()
.CallsTo(x => x.Rollback()).DoesNothing();
executor.Configure()
.CallsTo(x => x.Commit()).DoesNothing();
executor.Configure()
.CallsTo(x => x.TransactionalExecutionOf(A<Action>.Ignored))
.CallsBaseMethod();
使用以下代码
var service = new Service(executor, repo);
service.ServiceMethod("notExists")
.Throws(new ServiceException());
我收到以下消息
当前代理生成器无法拦截指定方法,原因如下: - 无法拦截密封方法。
如果我直接在服务上调用该方法,例如
var service = new Service(executor, repo);
service.ServiceMethod("NotExists");
我收到这条消息
这是一个 DynamicProxy2 错误:拦截器试图为没有目标的方法“Void TransactionalExecutionOf(System.Action)”“继续”。当调用没有目标的方法时,没有“继续”的实现,拦截器有责任模仿实现(设置返回值、输出参数等)
现在我有点迷茫,不知道下一步该怎么做。