私はすべてのテストを一緒に実行した場合、特定のテストが失敗します(約7件)。しかし、私がクラス内でテストを実行すると(すべて同じクラスの一部です)、パスします。テストプロジェクトはWindows Phone 8.1 MSTestで、ResharperテストランナーとMSTestテストランナーの両方で実行しようとしましたが、どちらも同じ問題を示しています。ここに私のTestInitializeコードです:MSTestテストは単独で実行すると成功します。他のテストで実行すると失敗します。
[TestInitialize]
public void Init()
{
ResolveDependencies();
var adsApiService = ServiceLocator
.Current
.GetInstance<IApiService<ListAdsReply, PublicAdsEndPoint>>();
var navigationService = new NavigationServiceMock();
var mainPageTrackingService = ServiceLocator
.Current
.GetInstance<IMainPageTrackingService>();
var adInsertionTrackingService = ServiceLocator
.Current
.GetInstance<IAdInsertionTrackingService>();
var connectionService = ServiceLocator
.Current
.GetInstance<IConnectionService>();
_windowsApiService = new WindowsApiServiceMock();
var contactAboutTrackingService = ServiceLocator
.Current
.GetInstance<IContactAboutTrackingService>();
var filtersTrackingService = ServiceLocator
.Current
.GetInstance<IFiltersTrackingService>();
var filtersService = ServiceLocator
.Current
.GetInstance<IFiltersService>();
var messageHelperMock = new MessageHelperMock();
_mainPageViewModel = new MainPageViewModel(adsApiService, navigationService, mainPageTrackingService, adInsertionTrackingService, connectionService, _windowsApiService, contactAboutTrackingService,filtersTrackingService, filtersService, messageHelperMock);
}
ResolveDependencies
方法は、ユニティコンテナに依存関係を登録ServiceLocator.SetLocatorProvider
でそれを登録し、いくつかのAutomapperの設定を行う以外に特別な何もしていません。そこに非同期コードはありません。
[TestMethod]
public async Task GivenParameterIsProvidedThenFetchDataShouldReturnValidData()
{
_mainPageViewModel
.SearchParams
.Add(new KeyValuePair<string, string>("lim", "5"));
var searchParams = _mainPageViewModel.SearchParams;
await _mainPageViewModel.FetchData(searchParams);
var list = _mainPageViewModel.AdsList;
Assert.IsNotNull(list);
}
これは失敗するテストの1つです。
public async Task<ListAdsReplyViewModel> FetchData(List<KeyValuePair<string, string>> parameters)
{
_cancellationTokenSource = new CancellationTokenSource();
_cancellationTokenSource
.CancelAfter(Constants.TimeToCancelAsyncOperations);
AddSearchKeywordToSearchParams();
var result = await _listAdsReplyApiService
.GetWithParametersAsync(_cancellationTokenSource, parameters);
var vm = new ListAdsReplyViewModel
{
Ads = new List<AdInfoViewModel>()
};
foreach (var listAd in result.ListAds)
{
var listAdDto = Mapper.Map<ListAdDto>(listAd);
var adInfo = new AdInfoViewModel(_navigationService, _mainPageTrackingService)
{
ListAdDto = listAdDto
};
vm.Ads.Add(adInfo);
}
vm.NextPage = result.NextPage;
vm.ConfigEtag = result.ConfigEtag;
vm.Sorting = result.Sorting;
TotalAds = result.ListAdsCounterMap.AllAds;
return vm;
}
private void AddSearchKeywordToSearchParams()
{
if (!string.IsNullOrEmpty(SearchKeyWord))
{
var searchKeyword = SearchParams
.FirstOrDefault(x => x.Key == "q");
if (!searchKeyword.Equals(null))
SearchParams.Remove(searchKeyword);
SearchParams.Add(new KeyValuePair<string, string>("q", SearchKeyWord));
}
}
これはテスト対象のメソッドです。この問題は、foreach((var listAd in result.ListAds)
が呼び出されたときに発生するようです。
Test method App.Tests.Integration.App.Shared.ViewModels.MainPageViewModelTests.GivenParameterIsProvidedThenFetchDataShouldReturnValidData threw exception:
AutoMapper.AutoMapperMappingException:
Mapping types:
ListAd -> ListAdDto
Core.Api.Models.PublicAds.ListAd -> Core.Dto.ListAdDto
Destination path:
ListAdDto
Source value:
Core.Api.Models.PublicAds.ListAd ---> System.NullReferenceException: Object reference not set to an instance of an object.
at Core.Bootstrap.AutoMapperConfiguration.<>c__DisplayClass0_0.<Configure>b__12(ListAd src, ListAdDto dest)
at AutoMapper.Internal.MappingExpression`2.<>c__DisplayClass57_0.<AfterMap>b__0(Object src, Object dest)
at AutoMapper.TypeMap.<get_AfterMap>b__40_0(Object src, Object dest)
at AutoMapper.Mappers.TypeMapObjectMapperRegistry.PropertyMapMappingStrategy.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.Mappers.TypeMapMapper.Map(ResolutionContext context, IMappingEngineRunner mapper)
at AutoMapper.MappingEngine.AutoMapper.IMappingEngineRunner.Map(ResolutionContext context)
--- End of inner exception stack trace ---
at App.ViewModels.MainPageViewModel.<FetchData>d__34.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at App.Tests.Integration.App.Shared.ViewModels.MainPageViewModelTests.<GivenParameterIsProvidedThenFetchDataShouldReturnValidData>d__7.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
任意の考えを:私は失敗のテストのために次のエラーを取得するので、待たれていませんGetWithParametersAsync(_cancellationTokenSource, parameters);
ようなものですか?
他のテストまたは特定のものが実行されている場合のみ? (つまり、ブレークダウンの原因となるテストの組み合わせですか、それとも問題の原因となる特定のテスト/特定のテストですか)次に、デバッガを起動して、何かが間違っているかどうかを確認する手順をたどりますか?例外はnull refエラーがあることを示します。オートマッパと関係があるように見えます。試してみてください。 – Becuzz
あなたはMSTestがあなたのテストをマルチスレッドで実行することを考慮しましたか?そして、単一のテストを実行することによって、あなたはシングルスレッドを強制していますか?すべてのテストがUNITテストであり、実行順序や、共有リソースがすでにインスタンス化されている(またはインスタンス化の過程にある)可能性が他と並行して実行されている可能性があることに注意してください。 – PhillipH
@Becuzz私は束全体を実行するとテストが中断します(400以上のテスト、ユニットと統合テストがあります)。私が失敗したテスト、つまり同じクラスにあるテストだけを実行すると、それらは合格します。 PhillipHには、テストがマルチスレッドで実行されているように見えますが、ListAdDtoをマップするコードが実行されているので、NullRefの例外がスローされるため、待たずに –