Assert.ThrowsExceptionAsync 不工作

Assert.ThrowsExceptionAsync isn't working

问题:

我对 MSTest V2 for examples or documentation 了解不多。 Assert.ThrowsExceptionAsync的正确使用方法是什么?

public void GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException()
{
    var playlistId = Guid.NewGuid().ToString();
    var manager = PlaylistTargetsFakeFactory.GetPlaylistTargetFusionManager();
    Assert.ThrowsException<PlaylistNotFoundException>(async () =>
    {
       await manager.GetPlaylistByIdAsync(playlistId);
    });
}

这也未通过测试:

Assert.ThrowsException<PlaylistNotFoundException>(() =>
{
    return manager.GetPlaylistByIdAsync(playlistId);
});

Message: Assert.ThrowsException failed. No exception thrown. PlaylistNotFoundException exception was expected.

这对我来说是失败的,即使我已经调试它并且肯定会抛出异常。

由于这仍然是一个 RC,因此可能存在错误。我在尝试转换的 2 个测试中都有这个,所以我可以使用 VS 2017。

更新:这就过去了。

[TestMethod]
public async Task GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException()
{
    var playlistId = Guid.NewGuid().ToString();
    var manager = PlaylistTargetsFakeFactory.GetPlaylistTargetFusionManager();
    //Assert.ThrowsException<PlaylistNotFoundException>(() =>
    //{

    try
    {
        await manager.GetPlaylistByIdAsync(playlistId);
        Assert.Fail();
    }
    catch (PlaylistNotFoundException)
    {
        Assert.IsTrue(true);
    }

    //});
}

更新 2: 在 Stephen Cleary 的回答之后,我做了这个更改。感谢您指出我的误用。我已经更改了一段时间,因为我收到“消息:测试方法。Test.Models.Helpers.PlaylistTargetFusionManagerTests.GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException 抛出异常: System.MissingMethodException:找不到方法:'System.Threading.Tasks.Task1<!!0> Microsoft.VisualStudio.TestTools.UnitTesting.Assert.ThrowsExceptionAsync(System.Func1<System.Threading.Tasks.Task>)'。”当我 运行 测试时。

[TestMethod]
[TestCategory(TestCategories.CSharp)]
[TestCategory(TestCategories.PlaylistTargets)]
public async Task GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException()
{
    var playlistId = Guid.NewGuid().ToString();
    var manager = PlaylistTargetsFakeFactory.GetPlaylistTargetFusionManager();
    await Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(() => manager.GetPlaylistByIdAsync(playlistId));
}

我的 packages.json

中有 2 个包裹
 <package id="MSTest.TestAdapter" version="1.1.9-rc2" targetFramework="net451" />
 <package id="MSTest.TestFramework" version="1.0.8-rc2" targetFramework="net451" />

What is the correct way to use Assert.ThrowsExceptionAsync?

您没有打电话给 ThrowsExceptionAsync. You're calling ThrowsException。调用 ThrowsExceptionAsync 的正确方法是 await 它的结果。

这应该有效:

public async Task GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException()
{
  var playlistId = Guid.NewGuid().ToString();
  var manager = PlaylistTargetsFakeFactory.GetPlaylistTargetFusionManager();
  await Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(async () =>
  {
     await manager.GetPlaylistByIdAsync(playlistId);
  });
}

或者,更简单地说:

  await Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(() =>
     manager.GetPlaylistByIdAsync(playlistId));

在完成我的问题之后,我创建了一个简单的新项目,它是 .Net 4.5.2 并且可以正常工作。意识到.Net版本差异后,我改变了我的项目并且测试通过了。我意识到我们需要升级,因为 4.5.1 是 no longer supported by Microsoft,我会尽快开始处理它。我想这会是一个比 SO 问题更好的博客 post。

主要修复是将packages.json更改为将targetFramework="net451"更改为targetFramework="net452".

<package id="MSTest.TestAdapter" version="1.1.9-rc2" targetFramework="net452" />
<package id="MSTest.TestFramework" version="1.0.8-rc2" targetFramework="net452" />

因为您的方法是异步的,所以您可以尝试这样的操作,这也允许您测试引发的异常的值:

public void GetPlaylistByIdAsync_NonExistingPlaylist_ThrowsPlaylistNotFoundException()
{
    var playlistId = Guid.NewGuid().ToString();
    var manager = PlaylistTargetsFakeFactory.GetPlaylistTargetFusionManager();

    var ex = Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(
            async () =>
            {
                await manager.GetPlaylistByIdAsync(playlistId);
            }).Result;

    Assert.IsTrue(ex.ErrorCode == ...);
}

与其让你的测试异步并使用 await,不如使用这个:Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(() => manager.GetPlaylistByIdAsync(playlistId)).Wait(); 等待有助于测试异步方法