Testavior เป็นโซลูชันที่มีน้ำหนักเบาเพื่อช่วยให้คุณพัฒนาการทดสอบ พฤติกรรม สำหรับ ASP.NET Core
การทดสอบพฤติกรรมเป็นวิธีการทดสอบคุณสมบัติแอปพลิเคชันของคุณโดยใช้พฤติกรรมประเภทต่าง ๆ เพื่อครอบคลุม สถานการณ์การทำงาน
มันมีวิธีการที่ง่ายและมีประสิทธิภาพในการเขียนการทดสอบอัตโนมัติสำหรับแอปพลิเคชัน ASP.NET Core ของคุณ
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ การทดสอบพฤติกรรม ด้วย ASP.NET CORE โปรดดูที่นี่ http://geeklearning.io/a-different-approach-test-your-asp-net-core-application
Testavior มี 2 ห้องสมุด:
ในโครงการหลัก ASP.NET ของคุณ
> dotnet add package GeekLearning.Testavior.Configuration
ในโครงการทดสอบหน่วย. NET Core ของคุณ
> dotnet add package GeekLearning.Testavior
สภาพแวดล้อมการทดสอบที่จัดทำโดย Testavior ขึ้นอยู่กับ บริการการกำหนดค่าเริ่มต้น ที่ให้คุณแยกการกำหนดค่าสภาพแวดล้อม การผลิต ออกจากการกำหนดค่าสภาพแวดล้อม การทดสอบ บริการการกำหนดค่านี้แสดงโดยสัญญา IStartupConfigurationService ซึ่งกำหนดวิธี 3 วิธี: 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 - ในคลาส โปรแกรม ของคุณ:
ฉีด StartupConfigurationService ของคุณโดยเรียกใช้วิธี ConfigureStartup บน WebHostBuilder ของคุณ:
new WebHostBuilder ( )
.. .
. UseStartup < Startup > ( )
. ConfigureStartup < StartupConfigurationService > ( ) 3 - ในชั้นเรียน Startup ของคุณ:
IStartupConfigurationService ลงในคลาส StartupConfigureEnvironment ในตอนท้ายของตัวสร้าง StartupConfigureServices ในตอนท้ายของวิธี Startup.ConfigureServices เดิม configureservicesConfigure ที่จุดเริ่มต้นของวิธี Startup.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 - ในไฟล์โครงการทดสอบของคุณ:
เครื่องยนต์ มีดโกน ใช้ไฟล์การพึ่งพา (.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 ซึ่งให้ สภาพแวดล้อมการทดสอบ ที่เต็มไปด้วยคุณสมบัติที่มีประโยชน์ (ดูส่วน คุณสมบัติ )
แน่นอนว่าคุณสามารถใช้บริการการกำหนดค่าเริ่มต้นของคุณเอง (โดยใช้ Onboard TestStartupConfigurationService หรือไม่)
ในการสร้าง สภาพแวดล้อมการทดสอบ เพียงแค่ทำให้คลาส TestEnvironment โดยผ่าน Startup แอปพลิเคชัน ASP.NET Core ของคุณการใช้งาน IStartupConfigurationService ของคุณประเภทของ EF Core ObjectContext และเส้นทางสัมพัทธ์ไปยังโครงการ ASP.NET Core ของคุณ (จำเป็นต้องแก้ไขมุมมอง MVC)
var testEnvironment = new TestEnvironment < Startup , TestStartupConfigurationService < [ EF_DB_CONTEXT ] > > (
Path . Combine ( System . AppContext . BaseDirectory , @"[PATH_TO_WEB_APP]" ) ) ; เขียนการทดสอบ 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 ) ;
}และอย่าลังเลที่จะดูส่วนตัวอย่าง;)
การทดสอบมีความสุข! -