Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MSTest测试如果单独运行则成功,如果与其他测试一起运行则失败_C#_Unit Testing_Async Await_Mstest - Fatal编程技术网

C# MSTest测试如果单独运行则成功,如果与其他测试一起运行则失败

C# MSTest测试如果单独运行则成功,如果与其他测试一起运行则失败,c#,unit-testing,async-await,mstest,C#,Unit Testing,Async Await,Mstest,我遇到了一个非常奇怪的情况,如果我同时运行所有的测试,某些测试将失败(大约7个)。但是如果我只在类内运行测试(它们都是同一个类的一部分),那么它们就通过了。该测试项目是一个WindowsPhone8.1 MSTest,我尝试使用Resharper测试运行程序和MSTest测试运行程序运行它,它们都显示了相同的问题。以下是我的测试初始化代码: [TestInitialize] public void Init() { ResolveDependencies(); var ads

我遇到了一个非常奇怪的情况,如果我同时运行所有的测试,某些测试将失败(大约7个)。但是如果我只在类内运行测试(它们都是同一个类的一部分),那么它们就通过了。该测试项目是一个WindowsPhone8.1 MSTest,我尝试使用Resharper测试运行程序和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);
}
这是失败的测试之一

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));
     }
}

有什么想法吗?

由于评论中接受了这一点,因此我将其作为答案转载


“您是否考虑到MSTest将以多线程方式运行您的测试?通过执行单个测试,您将强制执行单个线程?请非常小心,您的所有测试都是单元测试,并且在执行顺序中彼此没有依赖关系,或者共享资源可能已经实例化(或在实例化过程中)由另一个并行运行的测试执行。”

由于评论中接受了这一点,我已重新发布了答案


“您是否考虑到MSTest将以多线程方式运行您的测试?通过执行单个测试,您将强制执行单个线程?请非常小心,您的所有测试都是单元测试,并且在执行顺序中彼此没有依赖关系,或者共享资源可能已经实例化(或在实例化过程中)由另一个并行运行的测试中断。”

当您运行任何其他测试或仅当某个测试运行时,这会中断吗?(即,是导致故障的任何测试组合,还是导致问题出现的仅是某个组合/特定测试?)其次,您是否启动了调试器并跟踪了步骤以查看哪里出了问题?异常显示您有一个null ref错误。它看起来也可能与automapper有关。在那里尝试一下。您是否考虑到MSTest将以多线程方式运行您的测试,并且通过执行单个测试,您正在强制执行single线程?请非常小心,您的所有测试都是单元测试,在执行顺序上彼此不依赖,或者共享资源可能已经被并行运行的另一个测试实例化(或正在实例化)。@Becuzz当我运行整组测试时,测试会中断(400多个测试,我有单元测试和集成测试)。如果我只运行失败的测试,而这些测试恰好在同一个类中,那么它们就通过了。PhillipH有一点,看起来这些测试正在运行多线程,但是映射ListAdDto的代码正在运行,并且没有像应该的那样等待,因此NullRef异常被忽略thrown@PhillipH你说得对,这可能就是发生的事情,它在跑骡子i线程。这些测试是集成测试,指向一个活动api,出于某种原因,它们不会被等待。除了在
testinitialize
中找到的测试之外,我没有找到任何依赖项或共享资源。当您运行任何其他测试或仅当某个测试运行时,这种情况是否会中断?(即,导致故障的是测试的任何组合,还是导致问题显现的只是某个组合/某个测试?)其次,您是否启动了调试器并跟踪了步骤以查看哪里出了问题?异常显示您有一个null ref错误。它看起来也可能与automapper有关。在那里尝试一下。您是否考虑到MSTest将以多线程方式运行您的测试,并且通过执行单个测试,您正在强制执行single线程?请非常小心,您的所有测试都是单元测试,在执行顺序上彼此不依赖,或者共享资源可能已经被并行运行的另一个测试实例化(或正在实例化)。@Becuzz当我运行整组测试时,测试会中断(400多个测试,我有单元测试和集成测试)。如果我只运行失败的测试,而这些测试恰好在同一个类中,那么它们就通过了。PhillipH有一点,看起来这些测试正在运行多线程,但是映射ListAdDto的代码正在运行,并且没有像应该的那样等待,因此NullRef异常被忽略thrown@PhillipH你说得对,这可能就是发生的事情,它在跑骡子i-threaded。这些测试是集成测试,指向一个实时api,出于某种原因,它们不会被等待。除了在
testinitialize
中找到的测试之外,我没有找到任何依赖项或共享资源。
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));
     }
}
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)