我正在尝试对使用应用程序变量的应用程序进行单元测试。程序中没有接口或虚拟方法,我发现很难使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 :(得分:0)
错误消息是有意义的 - 第一个错误是由于传递了mock而不是像这样的对象:
Mock<HttpApplication> app = new Mock<HttpApplication>();
context.Setup(ctx => ctx.ApplicationInstance).Returns(app.Object);
并且第二个错误看起来像是因为AccountServiceController不是从ControllerBase派生的,例如;如果它是API控制器而不是MVC。
答案 1 :(得分:-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");