我开始研究在XUnit中使用White UI测试。
我测试的基本结构是
当测试通过时,这真的很好用。但是,如果测试失败,则不会关闭该应用程序。如果多个测试失败,则会导致我的应用程序打开很多实例。
要解决这个问题,我使用try和finally块,但这不是很好。
是否有一个替代选项可以实现相同的清理行为,但看起来更好一些?就像“ RunOnAssertFail”方法一样?
[Fact]
public void MainWindowCreated()
{
bool testFailed = false;
Application application = Application.Launch(@"C:\Program\Program.exe");
Window mainWindow = GetWindow(application, "MainWidndow", 500);
try
{
testFailed = true;
mainWindow.Should().NotBe(null, ". Main Widndow could not be found");
testFailed = false;
}
finally
{
if (testFailed)
{
application.Close();
}
}
/*
* Rest of test case
*/
application.Close();
}
private static Window GetWindow(Application application,
string windowName,
int timeoutAfterMilliseconds)
{
Window window = null;
try
{
window = Retry.For(
() => application.GetWindows().First(
windowX => windowX.Title.Trim().Equals(windowName.Trim())),
TimeSpan.FromMilliseconds(timeoutAfterMilliseconds));
}
catch (InvalidOperationException)
{
}
return window;
}
需要运行xUnit,White和Fluent Assertions。
答案 0 :(得分:0)
在玩耍之后,我意识到断言是引发异常而不是实际断言。
因此,为了帮助整理它,尝试catch块更合适
try
{
mainWindow.Should().NotBeNull("because this window is required for the rest of the test");
}
catch(XunitException)
{
application.Close();
throw;
}
但是,这仍然不理想。
答案 1 :(得分:0)
在测试类上实现IDisposable
并将其用于清理该怎么办?