HttpRequest
具有大量非虚拟属性和方法。你永远无法嘲笑它。如果您从 Page.Request 访问它,您甚至不能实例化一个新的并为您的测试设置它的值。这是 UI 很少(如果有的话)进行自动化测试的原因之一;这通常是不可能的。这就是我们使用允许自动化测试的模式(例如 MVC 和 MVVM)的原因:通过将尽可能多的处理逻辑推送到可测试的单独类,我们减少了需要进行的手动测试量。
您可以使用的最好的选择是创建一个可以模拟的类(即使用虚拟方法或运动并将其转换为接口)并且只能HttpRequest
通过该类访问。
例如,如果您想要获取某些 cookie 值作为页面处理的一部分,您可以CookieHandler
按如下方式创建一个类:
public class CookieHandler
{
private HttpRequest CurrentRequest;
public CookieHandler(HttpRequest request)
{
CurrentRequest = request;
}
public virtual HttpCookie UserLanguagePreference
{
get
{
return CurrentRequest.Cookies["UserLanguagePreference"].Name;
}
}
}
这不是一个理想的课程,只是举例;因为UserLanguagePreference
是虚拟的,所以可以被Rhino嘲讽。您可以创建CookeHandler
一个单例(在您的测试中可替换),您可以在您的 UI 页面上使用基于属性的注入,或者您可以使用像 Unity 这样的 DI 框架。
关键是你不能用自动化单元测试来测试所有东西,所以不要打扰。尽可能多地进行测试,其余部分留给集成和手动用户验收测试。