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.Func
1<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();
等待有助于测试异步方法
问题:
我对 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.Func
1<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();
等待有助于测试异步方法