使用没有接口的Moq对应用程序变量进行单元测试

时间:2015-04-22 14:11:12

标签: c# asp.net-mvc unit-testing mocking 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%确定是否可以在没有接口的情况下完成。

2 个答案:

答案 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");