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 ) ;
}並隨意查看樣品部分;)
愉快的測試! :)