【问题标题】:Unit testing Application Variables with Moq without an interface在没有接口的情况下使用 Moq 对应用程序变量进行单元测试
【发布时间】:2015-06-30 06:30:26
【问题描述】:

我正在尝试对这个使用应用程序变量的应用程序进行单元测试。程序中没有接口或虚拟方法,我发现很难让 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&lt;System.Web.HttpContextBase,System.Web.HttpApplication&gt;.Returns(System.Web.HttpApplication)' has some invalid arguments

Error 5 Argument 1: cannot convert from 'Moq.Mock&lt;System.Web.HttpApplication&gt;' 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% 确定这是否可以在没有接口的情况下完成。

【问题讨论】:

  • 您不应该尝试模拟您不拥有的对象。你最终会跳过障碍并编写大量代码
  • 我拥有这些物品。 HttpContext.Current.Application["Username"] 是我在全局 asax 文件中声明的。
  • 你不拥有 HttpContext,只是你放在那里的一个变量。无论如何,你的问题在这里:context.Setup(ctx =&gt; ctx.ApplicationInstance).Returns(app); 应该是:context.Setup(ctx =&gt; ctx.ApplicationInstance).Returns(app.Object);
  • 这可能对你有一些帮助:stackoverflow.com/questions/1452418/…

标签: c# asp.net-mvc unit-testing mocking moq


【解决方案1】:

错误消息是有道理的——第一个错误是由于传递了模拟而不是像这样的对象:

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

第二个错误看起来是由于 AccountServiceController 不是从 ControllerBase 派生的,例如;如果它是 API 控制器而不是 MVC。

【讨论】:

    【解决方案2】:

    尝试用一个类来解释这个然后你可以模拟:

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

    【讨论】:

    • MyConfigsGetConfig 是什么?
    • @User456789 这是他为示例制作的课程。
    • @User456789 这是一个隐藏对 HttpContext.Current.Application["Username"] 的调用的类,你必须访问所有你需要的地方,而不是使用这个 MyConfigs.GetConfig() 。用户名。这有助于简化测试
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 2014-07-29
    • 1970-01-01
    • 1970-01-01
    • 2020-10-23
    • 1970-01-01
    • 2023-01-09
    • 2016-04-12
    相关资源
    最近更新 更多