【问题标题】:How to add a hard coded value to an object in a class from unit test for testing purpose如何从单元测试向类中的对象添加硬编码值以进行测试
【发布时间】:2017-07-09 11:52:21
【问题描述】:
[HttpGet]
public IHttpActionResult GetTerm()
{
    Response resp = new Response(); 
    resp = InfomationController.GetTermAndCond(); //line 'LI001'
    return Ok(resp);
} 
[TestMethod]
public void GetTerm_FromGetTerm()
{
    var controller = new ServController();
    IHttpActionResult actionResult = controller.GetTerm();

    Assert.IsNotNull(actionResult);
}

在上面的响应类中充当模板,根据GetTermAndCond();(静态方法)添加的值添加另一个字段(按摩)。

  1. 我想知道如何正确地为此编写单元测试 有一个静态方法。
  2. 有什么方法可以为 line 'LI001' 添加一个值 测试方法并检查这是否给出了相应的必要响应。

P.S.- 无论如何都不能更改源代码。我知道从某些角度来看这可能是重复的,但是我多次浏览堆栈并没有找到解决方案。因此,如果有人能找到这个问题的答案,那将是一个很大的帮助。

【问题讨论】:

  • 如果无法更改代码,可以使用 Microsoft Fakes 来伪造静态方法(例如,我倾向于使用它来伪造 DateTime.Now 的值)。但是,您应该真正重构您的代码以避免使用静态方法,而是使用服务接口提供值(例如IInformationControllerService)。请注意,还有其他可用的伪造工具 - 我只是倾向于使用 MS Fakes,因为它可靠并且内置在 Visual Studio(更昂贵的版本)中。
  • @RB。感谢您的快速评论。但是如果我使用微软的假货,它也会迫使我编辑主要代码。我怎样才能避免这种情况。
  • 不,不会的。编写单元测试是为了使对 InformationController.GetTermsAndConds 的任何调用都返回预设响应。您只需要更改单元测试代码...
  • @RB。再次感谢。我现在指的是关于 Microsoft fakes 的文档。你能给我一些快速找到的方向吗?
  • 我添加了一个带有示例代码的答案。不过,您的单元测试有点奇怪 - 它两次调用 controller.GetTerm...?

标签: c# asp.net unit-testing static-methods


【解决方案1】:

为包含InformationController 的程序集生成一个Fakes 程序集。然后你可以重写你的单元测试方法:

[TestMethod]
public void GetTerm_FromGetTerm()
{
    var controller = new ServController();

    using (ShimsContext.Create())
    {
        MyAssembly.Fakes.ShimInteractionController.GetTermsAndConds = () => SomeCannedResponse();

        IHttpActionResult actionResult = controller.GetTerm();
        var result = controller.GetTerm(); // Why do you call GetTerm twice?!
        Assert.IsNotNull(actionResult);
    }
}

【讨论】:

  • 非常感谢您。我真的很感激。要使用它,我需要在单元测试项目中将 Microsoft fake 添加到我的引用中不是吗.....?或者有什么文件可以包含在这个...?
  • msdn.microsoft.com/en-us/library/hh549175.aspx 中搜索“添加假货程序集” - 这为实际使用假货提供了一个很好的教程。请注意,您将需要高于 Professional 的 Visual Studio 版本 - 如果有问题,可以使用其他 Faking 工具...
  • 非常感谢您的帮助。我很确定我现在走在正确的轨道上。我正在使用 VS Ultimate 2013 版本 12.0.31101.00。 MS 假货在 VS 产品之后或包括在内。
  • 我找到了使用 Microsoft Fakes 的解决方案。再次非常感谢 @RB。 的帮助。
猜你喜欢
  • 2011-12-19
  • 2012-01-08
  • 2019-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2017-04-14
  • 2021-12-07
相关资源
最近更新 更多