Assert.ThrowsExceptionAsync不起作用

Ali*_*ned 6 c# unit-testing mstest

问题:我没有太多关于MSTest V2的示例或文档.使用Assert.ThrowsExceptionAsync的正确方法是什么?

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

这也未通过测试:

Assert.ThrowsException<PlaylistNotFoundException>(() =>
{
    return manager.GetPlaylistByIdAsync(playlistId);
});
Run Code Online (Sandbox Code Playgroud)

"消息:Assert.ThrowsException失败.没有抛出异常.预计会出现PlaylistNotFoundException异常."

这对我来说是失败的,即使我已经调试它并且确实抛出了异常.

由于这仍然是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);
    }

    //});
}
Run Code Online (Sandbox Code Playgroud)

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

[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));
}
Run Code Online (Sandbox Code Playgroud)

我的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" />
Run Code Online (Sandbox Code Playgroud)

Ste*_*ary 15

使用Assert.ThrowsExceptionAsync的正确方法是什么?

你没打电话ThrowsExceptionAsync.你在打电话ThrowsException.调用的正确方法ThrowsExceptionAsyncawait结果.

这应该工作:

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

或者,更简单地说:

  await Assert.ThrowsExceptionAsync<PlaylistNotFoundException>(() =>
     manager.GetPlaylistByIdAsync(playlistId));
Run Code Online (Sandbox Code Playgroud)