【发布时间】: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();(静态方法)添加的值添加另一个字段(按摩)。
- 我想知道如何正确地为此编写单元测试 有一个静态方法。
- 有什么方法可以为 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