我有大约12个单元测试来测试不同的场景,需要在这些测试中调用一个异步方法(有时一个测试中会多次调用)。当我运行“Run all”时,其中3个测试总是失败。但如果我使用“Run selected test”逐个运行它们,它们就会通过。我在输出中获得的异常信息如下:
System.AppDomainUnloadedException:尝试访问已卸载的AppDomain。如果测试启动了一个线程但没有停止它,则可能会发生这种情况。请确保测试启动的所有线程在完成之前都已停止。
由于代码相当庞大,我无法分享代码,也不知道从哪里开始,因此这里提供一个示例。
编辑: 另外两种失败的方法分别将时间设置为未来和过去。
System.AppDomainUnloadedException:尝试访问已卸载的AppDomain。如果测试启动了一个线程但没有停止它,则可能会发生这种情况。请确保测试启动的所有线程在完成之前都已停止。
由于代码相当庞大,我无法分享代码,也不知道从哪里开始,因此这里提供一个示例。
[TestMethod]
public async Task SampleTest()
{
var someProvider = new SomeProvider();
var result = await someProvider.IsSomethingValid();
Assert.IsTrue(result == SomeProvider.Status.Valid);
NetworkController.Disable();
result = await someProvider.IsSomethingValid();
Assert.IsTrue(result == SomeProvider.Status.Valid);
NetworkController.Enable();
}
编辑: 另外两种失败的方法分别将时间设置为未来和过去。
[TestMethod]
public async Task SetTimeToFutureTest()
{
var someProvider = new SomeProvider();
var today = TimeProvider.UtcNow().Date;
var result = await someProvider.IsSomethingValid();
Assert.IsTrue(result == SomeProvider.Status.Valid);
TimeProvider.SetDateTime(today.AddYears(1));
var result2 = await someProvider.IsSomethingValid();
Assert.IsTrue(result2 == SomeProvider.Status.Expired);
}
时间提供程序长这样:
public static class TimeProvider
{
/// <summary> Normally this is a pass-through to DateTime.Now, but it can be overridden with SetDateTime( .. ) for testing or debugging.
/// </summary>
public static Func<DateTime> UtcNow = () => DateTime.UtcNow;
/// <summary> Set time to return when SystemTime.UtcNow() is called.
/// </summary>
public static void SetDateTime(DateTime newDateTime)
{
UtcNow = () => newDateTime;
}
public static void ResetDateTime()
{
UtcNow = () => DateTime.UtcNow;
}
}
编辑2:
[TestCleanup]
public void TestCleanup()
{
TimeProvider.ResetDateTime();
}
其他方法类似,我将模拟时间/日期更改等操作。
我尝试通过从中获取.Result() 同步调用该方法等方式,但这并没有帮助。我在网上阅读了大量资料,但仍然苦苦挣扎。
有人遇到过同样的问题吗?任何提示将不胜感激。
NetworkController
)无关吗? - bashis