C# 线程在Moq中中止。使用异步等待时验证
我的测试方法。我在用xUnitC# 线程在Moq中中止。使用异步等待时验证,c#,unit-testing,async-await,xunit,threadabortexception,C#,Unit Testing,Async Await,Xunit,Threadabortexception,我的测试方法。我在用xUnit [Fact] public async void AccountController_RegisterTest() { const string testEmail = "test@test.com"; const string testPassword = "test@test.com"; var cacheMock = new Mock<ICacheProvider>(); var languageResolver
[Fact]
public async void AccountController_RegisterTest()
{
const string testEmail = "test@test.com";
const string testPassword = "test@test.com";
var cacheMock = new Mock<ICacheProvider>();
var languageResolverMock = new Mock<ILanguageResolver>();
languageResolverMock.Setup(x => x.GetCorrectLanguage("en", "en")).Returns("en");
languageResolverMock.Setup(x => x.GetDefaultLanguage()).Returns("en");
var contextMock = new Mock<IContextFactory>();
var localizationProvider = new Mock<ILocalizationProvider>();
localizationProvider.Setup(x => x.GetString(It.IsAny<string>(), It.IsAny<string>())).Returns(String.Empty);
var authenticationProvider = new Mock<IAuthenticationProvider>();
authenticationProvider.Setup(x => x.CheckExistsUser(It.IsAny<string>())).Returns(async () => false);
authenticationProvider.Setup(x => x.CreateUser(It.IsAny<RegisterModel>())).Returns(async () => true);
var languagesRepository = new Mock<LanguagesRepository>(MockBehavior.Default, contextMock.Object, cacheMock.Object);
languagesRepository.Setup(x => x.GetCorrectLanguage(It.IsAny<string>())).Returns(() => Task.Factory.StartNew(() => new Language { Code = "EN", Fullname = "English" }));
languagesRepository.Setup(x => x.GetDefaultLanguageAsync()).Returns(async () => new Language { Code = "EN", Fullname = "English" });
languagesRepository.Setup(x => x.AvailableLanguagesAsync()).Returns(async () => (new List<Language> { new Language { Code = "EN", Fullname = "English" } }).AsEnumerable());
var controllerMock = new Mock<AccountController>(MockBehavior.Default, authenticationProvider.Object, languagesRepository.Object, localizationProvider.Object, languageResolverMock.Object, cacheMock.Object) { CallBase = true };
controllerMock.Setup(x => x.CurrentAvailableLanguages()).Returns(() => Task.Factory.StartNew(() => (new List<SelectListItem> { new SelectListItem { Text = "English", Value = "En" } }).AsEnumerable()));
controllerMock.Setup(x => x.InitAvailableLanguages());
controllerMock.Setup(x => x.SetAuthenticateCookie(It.IsAny<RegisterModel>()));
controllerMock.Setup(x => x.RedirectToHomePage()).Returns(() => Task.Factory.StartNew(() => new RedirectToRouteResult(new RouteValueDictionary())));
await controllerMock.Object.Register(new RegisterModel { Email = testEmail, LanguageID = 0, Password = testPassword, RememberMe = true });
authenticationProvider.Verify(x => x.CheckExistsUser(It.Is<string>(y => y == testEmail)), Times.Once());
authenticationProvider.Verify(x => x.CreateUser(It.Is<RegisterModel>(y => y.Email == testEmail && y.Password == testPassword)), Times.Exactly(12));
}
xUnit不支持
异步void
单元测试AFAIK。尝试更改单元测试以返回任务
authenticationProvider.Verify(x => x.CheckExistsUser(It.Is<string>(y => y == testEmail)), Times.Once());
[AllowAnonymous]
[HttpPost]
public async Task<ActionResult> Register(RegisterModel model)
{
InitAvailableLanguages();
try
{
ValidationResult result;
if ((result = new RegisterModelCustomValidator().Validate(model)).IsValid)
{
if (!(await this.AuthProvider.CheckExistsUser(model.Email)))
{
if (!(await this.AuthProvider.CreateUser(model)))
{
ModelState.AddModelError(string.Empty, L("Server error. Please, try later..."));
return View(model);
}
SetAuthenticateCookie(model);
return await RedirectToHomePage();
}
ModelState.AddModelError(string.Empty, L("User already exists"));
return View(model);
}
foreach (var error in result.Errors)
ModelState.AddModelError(error.PropertyName, this.LocalizationProvider.GetString(error.ErrorMessage, Thread.CurrentThread.CurrentUICulture.Name));
}
catch (Exception ex)
{
Logger.Error(ex);
}
return View(model);
}