我想單元測試使用應用程序變量的這個應用程序。程序中沒有接口或虛擬方法,我發現很難讓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%肯定這是否可以無需接口就可以完成。
你不應該試圖模擬你不擁有的物體。你最終會跳過籃球並寫下很多代碼 – Jedediah
我擁有這些對象。 'HttpContext.Current.Application [「用戶名」]'由我在全局asax文件中聲明。 – User456789
雖然你不擁有HttpContext,但只是一個變量。無論如何,你的問題在這裏:'context.Setup(ctx => ctx.ApplicationInstance).Returns(app);' 應該是:'context.Setup(ctx => ctx.ApplicationInstance).Returns(app.Object) ;' – Jedediah