如何在MSTest中为断言返回类型为空的方法使用用户断言

时间:2018-09-21 05:31:31

标签: c# task mstest void

我的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?
我们非常感谢您的帮助。

3 个答案:

答案 0 :(得分:0)

如果直接测试AnotherMethod,您将看到它是否成功。当它抛出异常时,测试将失败。 SampleMethod仅实现try catch,并调用可以直接测试的AnotherMethod()。

{{1}}

如果此测试抛出异常,则该测试将失败。如果该方法未引发异常,则表示成功。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

根据我在其他答案中的评论,我尝试向您展示如何获取控制台输出。您可以从控制台读取所有文本,您必须将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尝试过,仅通过控制台程序尝试过。