Тест Xunit не проходит с NU1701 - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь запустить свои юнит-тесты для Xamarin, но не получается. Я добавил в свой проект следующие пакеты nuget:

  • MSTest.TestAdapter
  • MSTest.TestFramework
  • XUnit

Я вижу свои юнит-тесты в списке тестов. Но когда я запускаю один тест, я получаю следующее сообщение:

Тест не соответствует заданному фильтру тестов. FullyQualifiedName = ...

После небольшого исследования я нашел в разделе Build это сообщение:

Предупреждение NU1701: Пакет «MSTest.TestAdapter 1.4.0» был восстановлен с использованием «.NETFramework, Version = v4.6.1» вместо целевой платформы проекта «.NETCoreApp, Version = v2.0». Этот пакет может быть не полностью совместим с вашим проектом.

Как мне запустить тесты?

РЕДАКТИРОВАТЬ: я удалил MSTest Nuget из проекта и получил следующее:

Тест не соответствует данному фильтру тестов

РЕДАКТИРОВАТЬ 2: тест выглядит следующим образом:

using System;
using System.Collections.Generic;
using System.Text;
using App.Services;
using Xunit;

namespace App.Tests.Services
{
  public class HelperTest
  {
    [Fact]
    public void Encrypt_password_Test()
    {
      string password = "Helloworld";
      string expectedResult = "";
      string result = Helpers.Encrypt_password(password);

      Assert.Equal(expectedResult, result);
    }
  }
}

Я ожидаю, что тест не пройден из-за пустой строки.

Файл csproj:

<?xml version="1.0" encoding="utf-8"?>
<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <NeutralLanguage>en-GB</NeutralLanguage>
    <AssemblyName>App</AssemblyName>
    <RootNamespace>App</RootNamespace>
  </PropertyGroup>
  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <DebugType>pdbonly</DebugType>
    <DebugSymbols>true</DebugSymbols>
  </PropertyGroup>
  <ItemGroup>
    <PackageReference Include="Newtonsoft.Json" Version="12.0.2" />
    <PackageReference Include="SharpZipLib" Version="1.1.0" />
    <PackageReference Include="sqlite-net-pcl" Version="1.5.231" />
    <PackageReference Include="System.Numerics.Vectors" Version="4.5.0" />
    <PackageReference Include="Xamarin.Essentials" Version="1.2.0" />
    <PackageReference Include="Xamarin.Forms" Version="4.1.0.581479" />
    <PackageReference Include="Xamarin.Plugin.FilePicker" Version="2.1.18" />
    <PackageReference Include="xunit" Version="2.4.1" />
  </ItemGroup>
  <ItemGroup>
    <XliffResource Include="MultilingualResources\App.de.xlf" />
  </ItemGroup>
  <ItemGroup>
    <Compile Update="Localizations\AppResources.Designer.cs">
      <DesignTime>True</DesignTime>
      <AutoGen>True</AutoGen>
      <DependentUpon>AppResources.resx</DependentUpon>
    </Compile>
    <Compile Update="Views\Login\NewProfilePage.xaml.cs">
      <DependentUpon>NewProfilePage.xaml</DependentUpon>
    </Compile>
  </ItemGroup>
  <ItemGroup>
    <EmbeddedResource Update="Localizations\AppResources.resx">
      <Generator>ResXFileCodeGenerator</Generator>
      <LastGenOutput>AppResources.Designer.cs</LastGenOutput>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Settings\AppSettings.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Login\NewProfilePage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Settings\ProfilelistPage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Settings\ProfilePage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\ProjectPage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Settings\SensorListPage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\SensorTestPage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
    <EmbeddedResource Update="Views\Settings\SettingsPage.xaml">
      <Generator>MSBuild:UpdateDesignTimeXaml</Generator>
    </EmbeddedResource>
  </ItemGroup>
  <ItemGroup>
    <Folder Include="Tests\Projectlist\" />
    <Folder Include="Tests\Settings\" />
  </ItemGroup>
</Project>

Я также создал пример тестового проекта xunit. Там я заметил, что он использует netcoreapp2.1 в качестве TargetFramework. Когда я изменяю TargetFramework в моем приложении, это делает его несовместимым с Xamarin.

1 Ответ

1 голос
/ 15 июля 2019

Вы почти нашли решение самостоятельно. Действительно, причина, по которой тесты не выполняются, заключается в том, что целевые платформы netstandard не являются исполняемыми. netstandard - это контракт, но для него требуется среда выполнения, такая как netcoreapp, .NET Framework (например, net472), Xamarin или другие. Тесты обнаруживались статическим анализом, а не исполнением.

Обычный способ написания тестов для своего кода - это поместить тесты в отдельный проект. Это также означает, что когда вы отправляете ваше приложение клиентам, в устанавливаемых ими библиотеках нет тестового кода, который никогда не будет запущен, а просто увеличит загрузку без причины.

Итак, создайте тестовый проект xunit. В идеале он нацелен на ту же среду выполнения, на которой будет работать ваше приложение, но я никогда не занимался разработкой Xamarin, поэтому я не знаю, выполнимо ли это, поэтому, возможно, netcoreapp2.1 или netcoreapp2.2 достаточно хороши. Если вы используете Visual Studio, добавьте ссылку на проект , в противном случае отредактируйте csproj и добавьте <ProjectReference Include="../path/to/project.csproj" />.

Если в вашем рабочем коде есть внутренние классы, которые вы не хотите делать общедоступными, добавьте атрибут InternalsVisibleTo в вашу производственную сборку, и он будет доступен только для вашей тестовой сборки.

...