Testavior是一种轻巧的解决方案,可帮助您为ASP.NET核心开发行为测试。
行为测试是测试应用程序功能的一种方法,该功能应用不同类型的行为以涵盖功能方案。
它提供了一种简单有效的方法,可以为您的ASP.NET核心应用程序编写自动测试。
有关使用ASP.NET Core进行行为测试的更多信息,请在此处查看http://geeklearning.io/a-different-apphact-to-tect-test-your-asp-net-core-core-core-application
Testavior提供2个库:
在您的ASP.NET核心项目上
> dotnet add package GeekLearning.Testavior.Configuration
在您的.NET核心单元测试项目上
> dotnet add package GeekLearning.Testavior
Testavior提供的测试环境基于启动配置服务,该服务使您可以将生产环境配置与测试环境配置区分开。此配置服务由定义3种方法的合同IStartupConfigurationService表示: Configure ConfigureEnvironment - ConfigureService ,必须在启动例程中调用以注入环境依赖的配置。
1-在您的ASP.NET核心项目中:
StartupConfigurationService类(如果需要的话,请更改名称)。IStartupConfigurationService接口(可选,从DefaultStartupConfigurationService继承以使用默认的空实现)ConfigureServices :实现特定于生产环境的配置选项Configure :实现特定于生产环境的中间软件配置ConfigureEnvironment :实现在任何事物之前必须执行的操作样本:
public class StartupConfigurationService : DefaultStartupConfigurationService
{
public override void ConfigureServices ( IServiceCollection services , IConfigurationRoot configuration )
{
base . ConfigureServices ( services , configuration ) ;
var connection = "CONNECTION_STRING" ;
services . AddDbContext < [ EF_DB_CONTEXT ] > ( options =>
options . UseSqlServer ( connection ) ) ;
}
} 2-在您的计划课中:
通过在WebHostBuilder上调用ConfigureStartup方法来注入您的StartupConfigurationService :
new WebHostBuilder ( )
.. .
. UseStartup < Startup > ( )
. ConfigureStartup < StartupConfigurationService > ( ) 3-在您的Startup课中:
IStartupConfigurationService接口注入Startup类Startup构造函数末尾调用ConfigureEnvironment方法Startup.ConfigureServices的末尾调用ConfigureServices方法。Configureservices方法Startup.Configure的开头调用Configure方法。配置方法样本:
public class Startup
{
private IStartupConfigurationService externalStartupConfiguration ;
public Startup ( IHostingEnvironment env , IStartupConfigurationService externalStartupConfiguration = null )
{
this . externalStartupConfiguration = externalStartupConfiguration ;
this . externalStartupConfiguration . ConfigureEnvironment ( env ) ;
}
public void ConfigureServices ( IServiceCollection services )
{
services . AddMvc ( )
// Pass configuration (IConfigurationRoot) to the configuration service if needed
this . externalStartupConfiguration . ConfigureServices ( services , null ) ;
}
public void Configure ( IApplicationBuilder app , IHostingEnvironment env , ILoggerFactory loggerFactory )
{
this . externalStartupConfiguration . Configure ( app , env , loggerFactory ) ;
app . UseMvc ( ) ;
}
} 4-在您的测试项目文件中:
Razor Engine使用依赖项文件(.DEPS.JSON)在运行时解决一些参考。因此,为了测试应用程序的MVC部分,有必要导入这些文件。为此,请将以下部分添加到您的.csproj :
< Target Name = " CopyDepsFiles " AfterTargets = " Build " Condition = " '$(TargetFramework)'!='' " >
< ItemGroup >
< DepsFilePaths Include = " $([System.IO.Path]::ChangeExtension('%(_ResolvedProjectReferencePaths.FullPath)', '.deps.json')) " />
</ ItemGroup >
< Copy SourceFiles = " %(DepsFilePaths.FullPath) " DestinationFolder = " $(OutputPath) " Condition = " Exists('%(DepsFilePaths.FullPath)') " />
</ Target > 5-对于Xunit用户
如果您打算使用Xunit,请首先遵循官方文档,然后在您的测试项目中添加xunit.runner.json文件:
{
"shadowCopy" : false
}并将以下部分添加到您的.csproj :
< ItemGroup >
< None Include = " xunit.runner.json " CopyToOutputDirectory = " PreserveNewest " />
</ ItemGroup >如果要实现特定的配置,则需要特定的IStartupConfigurationService 。
Testavior带有特定于测试的IStartupConfigurationService实现: TestStartupConfigurationService ,该测试提供了充满有用功能的测试环境(请参阅功能部分)。
当然,您可以实现自己的启动配置服务(是否使用板上的TestStartupConfigurationService )。
要创建一个测试环境,只需通过将其传递给TestEnvironment环境类,将其传递给您的ASP.NET核心应用程序Startup ,您的IStartupConfigurationService实现,EF Core ObjectContext的类型以及ASP.NET Core Project的相对路径(解决MVC视图所需)。
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ; 仅使用测试环境发送Web请求来编写API测试:
[ TestMethod ]
public void ScenarioShouldBeOk ( )
{
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ;
var response = testEnvironment . Client . GetAsync ( "/api/data" ) . Result ;
response . EnsureSuccessStatusCode ( ) ;
// Test result content
var result = JsonConvert . DeserializeObject < Data [ ] > ( response . Content . ReadAsStringAsync ( ) . Result ) ;
Assert . AreEqual ( "data" , result . Data ) ;
} 编写MVC测试几乎与测试API一样容易,只是您可能要测试服务器返回的模型而不是视图。
为此, Testavior提供了一个ViewModel存储库,该存储库将截获和存储服务器返回的视图模型。
您可以使用ASP.NET核心依赖注入机制访问该存储库:
[ TestMethod ]
public void ScenarioShouldBeOk ( )
{
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ;
testEnvironment . Client . GetAsync ( "/" ) . Result . EnsureSuccessStatusCode ( ) ;
var viewModel = testEnvironment
. ServiceProvider
. GetRequiredService < ViewModelRepository > ( )
. Get < [ VIEWMODEL_TYPE ] > ( ) ;
Assert . AreEqual ( "data" , viewModel . Data ) ;
}并随意查看样品部分;)
愉快的测试! :)