首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Machine.Fakes如何测试虚拟方法的实现?

Machine.Fakes如何测试虚拟方法的实现?
EN

Stack Overflow用户
提问于 2012-03-23 22:51:56
回答 3查看 736关注 0票数 0

假设我有一个这样的控制器类:

代码语言:javascript
复制
public class ResourceController : AuthorizedController
{      
    public virtual string Resource()
    {
         //do magic
    }

    public virtual string ResourceParent()
    {
        var url = Resource();
        return url;
    }
}

}

使用测试工具:

代码语言:javascript
复制
[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()

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-25 20:59:15

实际上,在Machine.Fakes中并没有一个“真正”的解决方案。我认为你需要重新考虑你的夹具设计。

首先,正如Tim已经指出的,你不应该在主题本身上伪造任何方法。相反,您应该伪造控制器的依赖关系,并按规范中的原样使用控制器。" The“方法的预期用途是访问规范中主题的依赖项,但您在规范中尝试的是访问主题本身。我认为这就是问题所在。和subject实际上是单独的实例。这就是为什么你配置的交互不会发生。

只有一些选项可以在你的代码中修复这个问题:

  • 在您的代码中引入了一个新的依赖项,您可以通过
  • 将其存根。如果第一个依赖项看起来很重量级,您还可以将虚拟方法替换为控制器的函数依赖项,并使用"Configure“方法为您的规范注入特定于规范的依赖项。

HTH,

Bjoern

票数 3
EN

Stack Overflow用户

发布于 2012-03-24 07:56:14

如果你正在测试一个控制器,那么也许你不应该创建该控制器的模拟或伪装。否则,您只是在测试一个模拟,测试实际上没有任何有效性。

模拟或伪造控制器的依赖关系。测试真实的控制器。

票数 2
EN

Stack Overflow用户

发布于 2012-03-29 20:54:47

最后,我最终将此测试从Machine.Fakes中提取出来,并将其放入常规单元测试中。然后,我直接使用Moq配置HttpRequestBase来播种我需要的数据,然后手动创建我的控制器类并调用它上的方法。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9841331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档