2011-04-08 44 views

回答

1

如果你的意思是“对我单元测试HttpApplication类本身是否合理” - 不。除非你是ASP.NET团队的开发人员,否则不会。一般来说,你应该单元测试你正在编写的代码,而不是其他人的代码。但是,如果你的意思是“对我的单元测试依赖于HttpApplication的类是否有意义”,那么很可能是的。它可能是你有类为了声明你自己的类行为正确,它嘲笑(或否则伪造)HttpApplication类是很有意义的。

+0

你会定义IMyFunkyHttpApplication接口,然后在MyFunkyMvcApplication中实现接口:IMyFunkyHttpApplication?这不是我的想法。我正在查看某人的代码,并想知道重点是什么。 – user669226 2011-04-08 10:46:19

+0

如果我正确理解你的问题:有一个接口和一个实现接口的具体实现是很常见的。这样做的主要原因是将代码的使用者与实际实现分离开来。换句话说 - 你的代码使用SomeDependency的地方,它实际上通过ISomeDependency调用它。当你来测试时,你现在可以嘲笑这种依赖。这可以让你测试你的消费者代码,而不需要在依赖项中测试别人的代码。它还使您可以断言您的客户正确地调用了依赖关系。 – 2011-04-08 11:08:40

+0

我同意HttpApplication本身不应该被测试。但是,我肯定会测试存储在HttpApplication的子项中的任何应用程序特定的逻辑(通常在Global.asax.cs中)。在MVC项目中,该类保存配置代码,在webforms中包含应用程序级事件处理程序。嘲笑在这种情况下帮助很大,或手动创建假货 – Roman 2011-10-13 21:16:42

0

是的,如果你打算在单元测试中使用它,你需要嘲笑它。

我会做这样的:

1:添加一个公共静态属性/方法MvcApplication(在global.cs)

public static string MyProperty { get; set; } 

2:创建一个接口

public Interface IApplication 
    { 
     string MyProperty {get;set;} 
    } 

3:为你创建一个包装类MvcApplication并实现接口

public class MvcApplicationWrapper: IApplication 
{ 
    public string MyProperty 
       { 
        get{ 
       return MvcApplication.MyPropetry; 

        } 
       set{ 
       MvcApplication.MyPropetry = value; 
        } 

       } 
} 

4:控制器延迟加载上创建一个公共财产IApplication

private IApplication app; 
public IApplication Application{ 
get{ 
if(app == null){ 
app = new MvcApplicationWrapper(); 
} 
return app; 
} 
set 
{ 
app = value; 
} 
} 

5:当你的单元测试,创建一个嘲笑IApplication并设置控制器的应用特性

var controller = new Controller(); 
controler.Application = new MockApplication(); 
/* do you tests */