如何从 NUnit Assert.That 子句中的 lambda 表达式测试异常和 return 值

How to test for exceptions and a return value from a lambda expression in an NUnit Assert.That clause

我正在执行一个简单的 NUnit 测试,想确认我的方法没有异常。但是,此方法将 return 一些东西:我想测试 returned 值 以及

这是我现有的测试异常的代码(有效!):

// This works
[Test]
public void AbleToGetTheDatabaseNames()
{
    Assert.That( () => GetTheDatabaseNames(), Throws.Nothing);
}
private List<string> GetTheDatabaseNames()
{
    var mySql = new MySqlDb();
    return mySql.GetDatabaseNames();
}

但是,在 lambda 表达式 () => GetTheDatabaseNames() 中,我如何获得 returned 值,以便我可以继续测试 returned 字符串列表?

// This doesn't work
[Test]
public void AbleToGetTheDatabaseNames()
{
    Assert.That( () => GetTheDatabaseNames(), Throws.Nothing);
    Assert.That( retVal, Has.Count.EqualTo(1));
}
private List<string> GetTheDatabaseNames()
{
    var mySql = new MySqlDb();
    return mySql.GetDatabaseNames();
}

如何从 lambda 表达式中得到 retVal 以便我可以得到 returned List<string>?甚至可以在这里做吗?如果不是,推荐的模式是什么——我应该调用 GetTheDatabaseNames() 两次(这看起来是多余的)吗?

只需调用被测成员并获取返回值即可。如果没有错误被抛出,代码将流向完成。无需断言不会抛出任何错误。抛出的错误应该无法通过测试

[Test]
public void AbleToGetTheDatabaseNames() {
    //Arrange
    var mySql = new MySqlDb();

    //Act
    List<string> retVal = mySql.GetDatabaseNames();

    //Assert
    Assert.That(retVal, Has.Count.EqualTo(1));
}

另一种方法是在 lambda 表达式中捕获结果并将其传递给下一个断言。

[Test]
public void AbleToGetTheDatabaseNames() {
    //Arrange
    List<string> retVal = null;

    //Act
    Action act = () => retVal = new MySqlDb.GetDatabaseNames();

    //Assert
    Assert.That(act, Throws.Nothing);
    Assert.That(retVal, Has.Count.EqualTo(1));
}