【问题标题】:How to user Assert for methods with return type void in MSTest如何在 MSTest 中为返回类型为 void 的方法使用断言
【发布时间】:2018-09-21 05:31:30
【问题描述】:

我的 c# 应用程序中有一个类似于下面的方法。

public async Task SampleMethod()
{
    try
    {
        //some code 
        await AnotherMethod();
        // some code
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex.Message.ToString());        
    }
}

现在,我正在尝试使用 MStest 为上述方法编写一个单元测试用例。我写了如下内容。

[TestMethod]
public async Task SampleMethodTest()
{
    ClassName cn = new ClassName();
    await cn.SampleMethod();
 }

现在我如何知道测试用例是失败还是成功。我如何在这里使用 Assert?
非常感谢任何帮助。

【问题讨论】:

  • 你想测试什么?
  • @Sakuto 我想测试 SampleMethod()
  • 是的,但是您的方法中有哪些行为?你没有任何回报,也没有条件。您要测试的逻辑路径是什么?
  • @Sakuto 在 SampleMethod() 中,我这里没有提到任何代码,但是有一些条件和循环需要测试。我唯一担心的是,由于它没有返回任何值,我怎么知道方法是否失败。我是否必须返回一些值来测试方法?还是有其他方法?
  • 这取决于条件如何影响您的方法流程。例如,如果其中一个条件抛出异常,您可以只测试如果给定参数,它会抛出这个异常。

标签: c# task mstest void


【解决方案1】:

根据我其他答案中的 cmets,我尝试向您展示如何获取控制台输出。您可以从控制台读取所有文本,您必须将 StringWriter() 设置到控制台:

[TestMethod]
public async Task SampleMethodTest()
{
    using (StringWriter stringWriter = new StringWriter())
    {
        Console.SetOut(stringWriter);

        ClassName cn = new ClassName();
        await cn.SampleMethod();

        string consoleOutput = stringWriter.ToString();

        Assert.IsFalse(consoleOutput.Contains("Exception"));
    }
}

我希望这有效。我没有用 UnitTest 试过,只用控制台程序。

【讨论】:

    【解决方案2】:

    如果你直接测试另一个方法,你会看到它是否成功。当它抛出异常时,测试失败。 SampleMethod 只实现了 try catch 并调用了可直接测试的 AnotherMethod()。

    [TestMethod]
    public async Task SampleMethodTest()
    {
       ClassName cn = new ClassName();
       await cn.AnotherMethod();
     }
    

    如果抛出 Execption,则此测试失败。当方法没有抛出异常时,它是成功的。

    【讨论】:

    • 感谢您的回复。如果一个方法返回真或假,那么在测试方法中我们编写 Asset.IsTrue(returnvalue) 。由于 SampleMethod() 没有返回任何内容,我将在 Assert 中写什么?
    • 您不必使用断言。测试 AnotherMethod() ,如果此方法抛出异常,则测试失败。如果不是,则测试成功。当 AnotherMethod() 运行成功时, SampleMethod() 也会成功。
    • 您无法测试 SampleMethod() 的原因是它没有返回类型,并且您处理异常并且从不抛出。因此,每次执行该方法都会成功。因此,您应该直接测试 AnotherMethod()。
    • 我完全明白你说的。但是我需要为每个方法编写测试用例以增加代码覆盖率。
    • 所以你可以获取控制台输出并检查它。用这样的东西检查它: Assert.IsFalse(consoleOutput.Contains("Exception")).
    【解决方案3】:

    如果你的方法改变了对象的状态,你可以验证对象的状态是否和预期的一样。如果不是,您可以使用 Mock(使用像 Moq 这样的框架)来验证与其他对象的协作。请注意,您可能需要将 AnotherMethod 提取到另一个类,以便您可以模拟和验证调用。

    还请注意,您应该尝试设计您的软件,以便您可以在大多数单元测试中使用 Outputverification 和 Stateverification。使用模拟进行通信验证可能会导致难以维护的错误判断和单元测试。

    【讨论】:

      猜你喜欢
      • 2023-01-08
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 2016-11-28
      • 2016-11-09
      • 2015-06-29
      • 2014-04-17
      • 2014-04-23
      相关资源
      最近更新 更多