假设我有一个这样的控制器类:
public class ResourceController : AuthorizedController
{
public virtual string Resource()
{
//do magic
}
public virtual string ResourceParent()
{
var url = Resource();
return url;
}
}}
使用测试工具:
[Subject(typeof (ResourceController))]
public class When_I_want_the_parent_resource : WithSubject<ResourceController>
{
private static readonly string ParentUrl = "/organizations/1";
private static readonly string ResourceUrl = "/organizations/1/contacts/1";
private static string _result;
private Establish context = () =>
{
The<ResourceController>()
.WhenToldTo(x => x.Resource())
.Return(ResourceUrl);
};
private Because of = () => _result = Subject.ResourceParent();
private It should_match_the_expected_parent_url = () =>
_result.ShouldEqual(ParentUrl);
}此单元测试将失败,因为Subject.ResourceParent()将返回null,因为Machine.Fakes已自动锁定此方法。作为一种临时解决办法,我只是从ResourceParent中删除了虚拟关键字,以便能够测试我的代码。我假设必须有一个真正的解决方案让我告诉Machine.Fakes不要覆盖ResourceParent()
发布于 2012-03-25 20:59:15
实际上,在Machine.Fakes中并没有一个“真正”的解决方案。我认为你需要重新考虑你的夹具设计。
首先,正如Tim已经指出的,你不应该在主题本身上伪造任何方法。相反,您应该伪造控制器的依赖关系,并按规范中的原样使用控制器。" The“方法的预期用途是访问规范中主题的依赖项,但您在规范中尝试的是访问主题本身。我认为这就是问题所在。和subject实际上是单独的实例。这就是为什么你配置的交互不会发生。
只有一些选项可以在你的代码中修复这个问题:
HTH,
Bjoern
发布于 2012-03-24 07:56:14
如果你正在测试一个控制器,那么也许你不应该创建该控制器的模拟或伪装。否则,您只是在测试一个模拟,测试实际上没有任何有效性。
模拟或伪造控制器的依赖关系。测试真实的控制器。
发布于 2012-03-29 20:54:47
最后,我最终将此测试从Machine.Fakes中提取出来,并将其放入常规单元测试中。然后,我直接使用Moq配置HttpRequestBase来播种我需要的数据,然后手动创建我的控制器类并调用它上的方法。
https://stackoverflow.com/questions/9841331
复制相似问题