2015-04-22 63 views
0

我想單元測試使用應用程序變量的這個應用程序。程序中沒有接口或虛擬方法,我發現很難讓Moq工作。使用應用程序變量單元測試Moq不帶接口的應用程序變量

類:

static string Username = HttpContext.Current.Application["Username"].ToString(); 

它在global.asax文件被初始化。

我的單元測試:

[TestMethod] 
public void TestGetCompanyList() 
{ 
    Mock<HttpContextBase> context = new Mock<HttpContextBase>(); 
    Mock<HttpApplication> app = new Mock<HttpApplication>(); 

    context.Setup(ctx => ctx.ApplicationInstance).Returns(app); //ERROR 

    var accountController = new AccountServiceController(); 

    accountController.ControllerContext = new ControllerContext(context.Object, new RouteData(), accountController); //ERROR 


    CompInput cInput = new CompInput(); 
    cInput.IssuerName = "Addams"; 
    cInput.Ticker = "AD"; 
    var result = accountController.CompList(cInput) as IEnumerable<CompListResult>; 
    Assert.IsNotNull(result); 
} 

的第一個錯誤:

Error 4 The best overloaded method match for Moq.Language.IReturns<System.Web.HttpContextBase,System.Web.HttpApplication>.Returns(System.Web.HttpApplication)' has some invalid arguments

Error 5 Argument 1: cannot convert from 'Moq.Mock<System.Web.HttpApplication>' to 'System.Web.HttpApplication'

第二個錯誤:

Error 6 The best overloaded method match for 'System.Web.Mvc.ControllerContext.ControllerContext(System.Web.HttpContextBase, System.Web.Routing.RouteData, System.Web.Mvc.ControllerBase)' has some invalid arguments

Error 7 Argument 3: cannot convert from 'Stocktrage.Investor.AccountServiceAPI.Controllers.AccountServiceController' to 'System.Web.Mvc.ControllerBase'

這是使用MOQ(或任何嘲弄的工具)我的第一次,所以我不是100%肯定這是否可以無需接口就可以完成。

+0

你不應該試圖模擬你不擁有的物體。你最終會跳過籃球並寫下很多代碼 – Jedediah

+0

我擁有這些對象。 'HttpContext.Current.Application [「用戶名」]'由我在全局asax文件中聲明。 – User456789

+0

雖然你不擁有HttpContext,但只是一個變量。無論如何,你的問題在這裏:'context.Setup(ctx => ctx.ApplicationInstance).Returns(app);' 應該是:'context.Setup(ctx => ctx.ApplicationInstance).Returns(app.Object) ;' – Jedediah

回答

-1

嘗試用一個類來解釋這點,你可以嘲笑:

public class MyConfigs 
{ 
    public virtual object Username 
    { 
     get { return HttpContext.Current.Application["Username"]; } 
     set { } 
    } 


    public static MyConfigs GetConfig() 
    { 
     return new MyConfigs(); 
    } 

    protected MyConfigs() 
    { 

    } 

} 

在您的測試,你可以這樣做:

 Mock<MyConfigs> configsMoq = new Mock<MyConfigs>(); 
     configsMoq.SetupProperty(x => x.Username, "REturn"); 
+0

什麼是'MyConfigs'和'GetConfig'? – User456789

+0

@ User456789這是他爲一個例子製作的課程。 –

+0

@ User456789這是一個隱藏HttpContext.Current.Application [「用戶名」]調用的類,您必須在任何地方訪問您需要的所有位置,而不是使用此MyConfigs.GetConfig()。用戶名。這有助於簡化測試 – renefc3

0

錯誤消息意義 - 第一個錯誤是由於通過模擬而不是像這樣的對象:

Mock<HttpApplication> app = new Mock<HttpApplication>(); 
context.Setup(ctx => ctx.ApplicationInstance).Returns(app.Object); 

第二個錯誤看起來像是由於AccountSe例如,rviceController不是從ControllerBase派生的;如果它是一個API控制器而不是MVC。