创建解决方案
已完成的解决方案具有以下目录结构:
/unit-testing-using-dotnet-test
unit-testing-using-dotnet-test.sln
/PrimeService
PrimeService.cs
PrimeService.csproj
/PrimeService.Tests
PrimeService_IsPrimeShould.cs
PrimeServiceTests.csproj
用于创建测试解决方案的命令。
-
打开 shell 窗口。
-
运行下面的命令:
.NET Core CLI
-
using System; namespace Prime.Services { public class PrimeService { public bool IsPrime(int candidate) { throw new NotImplementedException("Not implemented."); } } } -
前面的代码:
- NotImplementedException,其中包含一条消息,指示未实现。
- 稍后在教程中更新。
-
在 unit-testing-using-dotnet-test 目录下运行以下命令,向解决方案添加类库项目:
.NET Core CLI
-
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
用于创建解决方案的命令
如果已完成上一部分中的步骤,请跳过本部分。
对于 macOS 和 Unix,请将 ren 命令更新为 OS 版本的 ren 以重命名文件:
dotnet new sln -o unit-testing-using-dotnet-test
cd unit-testing-using-dotnet-test
dotnet new classlib -o PrimeService
ren .\PrimeService\Class1.cs PrimeService.cs
dotnet sln add ./PrimeService/PrimeService.csproj
dotnet new xunit -o PrimeService.Tests
dotnet add ./PrimeService.Tests/PrimeService.Tests.csproj reference ./PrimeService/PrimeService.csproj
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj
请按照上一部分中的“将 PrimeService.cs 中的代码替换为以下代码”的说明进行操作。
创建测试
你可以重复使用此方法,编写失败的测试,然后更新目标代码使测试通过。
更新 PrimeService.Tests 项目:
- 删除 PrimeService.Tests/UnitTest1.cs。
- 创建 PrimeService.Tests/PrimeService_IsPrimeShould.cs 文件。
- 将 PrimeService_IsPrimeShould.cs 中的代码替换为以下代码:
using Xunit;
using Prime.Services;
namespace Prime.UnitTests.Services
{
public class PrimeService_IsPrimeShould
{
[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
}
}
}
dotnet test 使用单元测试项目启动测试运行程序。
使用以下代码更新 IsPrime:
public bool IsPrime(int candidate)
{
if (candidate == 1)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
测试通过。
添加更多测试
你可以复制上述测试并将以下代码更改为使用 0 和 -1:
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
以下 xUnit 属性允许编写类似测试套件:
[Theory]表示执行相同代码,但具有不同输入参数的测试套件。[InlineData]属性指定这些输入的值。
替换以下代码:
[Fact]
public void IsPrime_InputIs1_ReturnFalse()
{
var primeService = new PrimeService();
bool result = primeService.IsPrime(1);
Assert.False(result, "1 should not be prime");
}
替换为以下代码:
[Theory]
[InlineData(-1)]
[InlineData(0)]
[InlineData(1)]
public void IsPrime_ValuesLessThan2_ReturnFalse(int value)
{
var result = _primeService.IsPrime(value);
Assert.False(result, $"{value} should not be prime");
}
2 是最小的素数。
若要使所有测试通过,请使用以下代码更新 IsPrime 方法:
public bool IsPrime(int candidate)
{
if (candidate < 2)
{
return false;
}
throw new NotImplementedException("Not fully implemented.");
}
库的完整实现。
已完成的 IsPrime 方法不是用于测试素性的有效算法。
其他资源
-
dotnet new sln -o unit-testing-using-dotnet-testdotnet new sln命令用于在 unit-testing-using-dotnet-test 目录中创建新的解决方案。 -
将目录更改为 unit-testing-using-dotnet-test 文件夹。
-
运行下面的命令:
.NET Core CLI -
dotnet new classlib -o PrimeService新的类库将包含要测试的代码。
-
将 Class1.cs 重命名为 PrimeService.cs 。
-
将 PrimeService.cs 中的代码替换为以下代码:
C# -
dotnet sln add ./PrimeService/PrimeService.csproj -
运行以下命令创建 PrimeService.Tests 项目:
.NET Core CLI -
dotnet new xunit -o PrimeService.Tests -
上面的命令:
- xUnit 用作测试库。
-
通过将以下
<PackageReference />元素添加到项目文件来配置测试运行程序:- “Microsoft.NET.Test.Sdk”
- “xunit”
- “xunit.runner.visualstudio”
-
运行以下命令将测试项目添加到解决方案文件:
.NET Core CLI -
dotnet sln add ./PrimeService.Tests/PrimeService.Tests.csproj -
将
PrimeService类库作为一个依赖项添加到 PrimeService.Tests 项目中:.NET Core CLI