2011-07-13 122 views
0
public SupportedBrowser GetBrowser() 
    { 
     string agent = HttpContext.Current.Request.Headers["User-Agent"]; 

     if (agent.Contains("iPad")) 
     { 
      return new iPad(); 
     } 
     else 
      return new InternetExplorer7(); 
    } 

我使用Microsofts单元测试工具(MS-Test?)为上述方法设置单元测试。因为单元测试不是一个网站,所以没有HttpContext。我可以想到两种解决方案:使用HttpContext的单元测试方法

A.添加一个可选的参数:GetBrowser(bool debug = false)。这允许当前代码在不重构的情况下执行。然后修改该方法以在调试为真时创建模拟上下文或硬编码的用户代理。

B.添加依赖注入。从其他地方获取上下文。尽管如此,我认为我需要通过ninject放弃IoC来实现自动化。这是很多工作。

你能想出更好的东西或改进这些想法吗?

请注意,此方法位于类库中。我想保持这种方式。

回答

2

您的代理字符串是嘲笑的自然场所。而不是从此方法内的请求上下文中获取代理程序字符串,请将其传递或注入方法/类。这样你就可以在测试和运行时控制它。

+0

用于提倡DI(依赖注入)的+1 – Nauman

+0

我喜欢DI,但正如我在我的问题中发布的,我认为这将会有相当多的工作。由于HttpContext.Request.UserAgent是只读的,我不能设置测试。我可能需要全力以赴使用类似于mallows98的答案这里http://stackoverflow.com/questions/1452418/how-do-i-mock-the-httpcontext-in-asp-net-mvc-using-moq。试图避免这种路线。 –

+1

不要注入上下文,注入代理字符串。这会让你完全控制它。 –