小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

使用Visual Studio Code開(kāi)發(fā)Asp.Net Core WebApi學(xué)習(xí)筆記(九)

 黃金屋1 2019-05-31

本篇將結(jié)合這個(gè)系列的例子的基礎(chǔ)上演示在Asp.Net Core里如何使用XUnit結(jié)合Moq進(jìn)行單元測(cè)試,同時(shí)對(duì)整個(gè)項(xiàng)目進(jìn)行集成測(cè)試。

第一部分、XUnit

修改 Project.json 文件內(nèi)容,增加X(jué)Unit相關(guān)的nuget包引用,并修改部分配置。

復(fù)制代碼
 1 {
 2   "version": "1.0.0-*",
 3   "testRunner": "xunit",  // 設(shè)置測(cè)試工具為xunit
 4 
 5   "buildOptions": {
 6     "debugType": "portable",
 7     "emitEntryPoint": true
 8   },
 9   "dependencies": {
10     "Microsoft.NETCore.App": {
11       "type": "platform",
12       "version": "1.0.0"
13     },
14     "Microsoft.AspNetCore.Server.Kestrel": "1.0.0",
15     "Microsoft.AspNetCore.Mvc": "1.0.0",
16     "Microsoft.Extensions.Logging": "1.0.0",
17     "Microsoft.Extensions.Logging.Console": "1.0.0",
18     "Microsoft.Extensions.Logging.Debug": "1.0.0",
19     "Microsoft.Extensions.Logging.Filter": "1.0.0",
20     "NLog.Extensions.Logging": "1.0.0-rtm-alpha2",
21     "Autofac.Extensions.DependencyInjection": "4.0.0-rc3-309",
22     "Microsoft.Extensions.Configuration": "1.0.0",
23     "Microsoft.Extensions.Configuration.FileExtensions": "1.0.0",
24     "Microsoft.Extensions.Configuration.Json": "1.0.0",
25     "Microsoft.Extensions.Options.ConfigurationExtensions": "1.0.0",
26     "xunit": "2.2.0-beta2-build3300",
27     "dotnet-test-xunit": "2.2.0-preview2-build1029"
28   },
29   "frameworks": {
30     "netcoreapp1.0": {
31       // 設(shè)置兼容框架
32       "imports": [
33         "dotnet54",
34         "portable-net45+win8" 
35       ]
36     }
37   }
38 }
復(fù)制代碼

增加一個(gè)Demo類和一個(gè)測(cè)試類

復(fù)制代碼
 1 namespace WebApiFrame
 2 {
 3     public class DemoModel
 4     {
 5         public int Add(int a, int b)
 6         {
 7             return a + b;
 8         }
 9 
10         public bool IsOdd(int num)
11         {
12             return num % 2 == 1;
13         }
14     }
15 }
復(fù)制代碼
復(fù)制代碼
 1 using Xunit;
 2 
 3 namespace WebApiFrame.Test
 4 {
 5     public class DemoModelTest
 6     {
 7         private readonly DemoModel _demo;
 8 
 9         public DemoModelTest()
10         {
11             _demo = new DemoModel();
12         }
13 
14         [Fact]
15         public void AddTest()
16         {
17             int result = _demo.Add(1, 2);
18             Assert.Equal(3, result);
19         }
20     }
21 }
復(fù)制代碼

打開(kāi)cmd窗口,進(jìn)入到項(xiàng)目根目錄,輸入命令 dotnet test ,將啟動(dòng)單元測(cè)試,可以在輸出查看測(cè)試結(jié)果

再對(duì)另外一個(gè)方法添加單元測(cè)試代碼

復(fù)制代碼
1         [Theory]
2         [InlineData(1)]
3         [InlineData(2)]
4         [InlineData(3)]
5         public void IsOdd(int num)
6         {
7             bool result = _demo.IsOdd(num);
8             Assert.True(result, $"{num} is not odd.");
9         }
復(fù)制代碼

再次啟動(dòng)單元測(cè)試,查看測(cè)試結(jié)果

結(jié)果顯示執(zhí)行了四個(gè)單元測(cè)試用例,有一個(gè)失敗了。

通過(guò)比較上面兩個(gè)測(cè)試方法可以發(fā)現(xiàn)使用的特性標(biāo)識(shí)不同,測(cè)試方法的參數(shù)列表也不相同。

[Face]特性標(biāo)識(shí)表示固定輸入的測(cè)試用例,而[Theory]特性標(biāo)識(shí)表示可以指定多個(gè)輸入的測(cè)試用例,結(jié)合InlineData特性標(biāo)識(shí)使用。在上面的例子里,總共使用了三次InlineData特性標(biāo)識(shí),每次設(shè)定的值都不同,在執(zhí)行單元測(cè)試時(shí),設(shè)定的值會(huì)被測(cè)試框架賦值到對(duì)應(yīng)的測(cè)試方法的參數(shù)里。

 

第二部分、Moq

在之前的例子里已經(jīng)定義了如下接口和類

IUserRepository.cs
UsersController.cs

我們要對(duì) UsersController.cs 的方法進(jìn)行單元測(cè)試,同時(shí)UserRepository實(shí)例是通過(guò)構(gòu)造函數(shù)依賴注入的,所以要借助Moq來(lái)模擬這個(gè)實(shí)例的生成。

在引入Moq包之前,先要修改NuGet.Config配置文件,增加package包源地址。

NuGet.Config配置文件路徑: C:\Users\{user}\AppData\Roaming\NuGet 

復(fù)制代碼
 1 <?xml version="1.0" encoding="utf-8"?>
 2 <configuration>
 3   <activePackageSource>
 4     <add key="" value="https://www./api/v2/" />
 5   </activePackageSource>
 6   <packageSources>
 7     <add key="" value="https://api./v3/index.json" protocolVersion="3" />
 8 
 9     <!-- 增加的程序包源地址 -->
10     <add key="aspnet-contrib" value="https://www./F/aspnet-contrib/api/v3/index.json" />
11   </packageSources>
12 </configuration>
復(fù)制代碼

引入Moq相關(guān)nuget包: "moq.netcore": "4.4.0-beta8" 

添加單元測(cè)試類

復(fù)制代碼
 1 using System.Collections.Generic;
 2 using System.Linq;
 3 using Microsoft.AspNetCore.Mvc;
 4 using Moq;
 5 using WebApiFrame.Controllers;
 6 using WebApiFrame.Models;
 7 using WebApiFrame.Repositories;
 8 using Xunit;
 9 
10 namespace WebApiFrame.Test
11 {
12     public class UsersControllerTest
13     {
14         private readonly UsersController _controller;
15 
16         public UsersControllerTest()
17         {
18             var mockRepo = new Mock<IUserRepository>();
19             mockRepo.Setup(repo => repo.GetAll()).Returns(GetUsers());
20             _controller = new UsersController(mockRepo.Object);
21         }
22 
23         [Fact]
24         public void GetAllTest()
25         {
26             IActionResult actionResult = _controller.GetAll();
27             var objectResult = Assert.IsType<ObjectResult>(actionResult);
28             var result = Assert.IsAssignableFrom<IEnumerable<User>>(objectResult.Value);
29             Assert.Equal(3, result.Count());
30         }
31 
32         private IEnumerable<User> GetUsers()
33         {
34             return new List<User>()
35             {
36                 new User(){ Id = 1, Name = "name:1", Sex = "Male" },
37                 new User(){ Id = 2, Name = "name:2", Sex = "Female" },
38                 new User(){ Id = 3, Name = "name:3", Sex = "Male" },
39             };
40         }
41     }
42 }
復(fù)制代碼

在cmd窗口執(zhí)行單元測(cè)試,查看測(cè)試結(jié)果

在一個(gè)分層結(jié)構(gòu)清晰的項(xiàng)目里,各層之間依賴于事先約定好的接口。在多人協(xié)作開(kāi)發(fā)時(shí),大多數(shù)人都只會(huì)負(fù)責(zé)自己的那一部分模塊功能,開(kāi)發(fā)進(jìn)度通常情況下也不一致。當(dāng)某個(gè)開(kāi)發(fā)人員需要對(duì)自己的模塊進(jìn)行單元測(cè)試而依賴的其他模塊還沒(méi)有開(kāi)發(fā)完成時(shí),則需要對(duì)依賴的接口通過(guò)Mock的方式提供模擬功能,從而達(dá)到在不實(shí)際依賴其他模塊的具體功能的情況下完成自己模塊的單元測(cè)試工作。

 

第三部分、集成測(cè)試

以上的例子只是對(duì)邏輯進(jìn)行了單元測(cè)試。對(duì)于Asp.Net Core項(xiàng)目,還需要模擬在網(wǎng)站部署的情況下對(duì)各個(gè)請(qǐng)求入口進(jìn)行測(cè)試。通常情況下可以借助Fiddler等工具完成,在.Net Core里也可以用編程的方式完成測(cè)試。

首先引入測(cè)試需要的nuget包。因?yàn)槲覀儨y(cè)試的是WebApi接口,響應(yīng)內(nèi)容都是json格式的字符串,所以還需要引用json序列化的nuget包。

    "Microsoft.AspNetCore.TestHost": "1.0.0",
    "Newtonsoft.Json": "9.0.1"

添加測(cè)試類

復(fù)制代碼
 1 using System.Collections.Generic;
 2 using System.Net.Http;
 3 using System.Threading.Tasks;
 4 using Microsoft.AspNetCore.Hosting;
 5 using Microsoft.AspNetCore.TestHost;
 6 using Newtonsoft.Json;
 7 using WebApiFrame.Models;
 8 using Xunit;
 9 
10 namespace WebApiFrame.Test
11 {
12     public class WebApiFrameTest
13     {
14         private readonly TestServer _server;
15         private readonly HttpClient _client;
16 
17         public WebApiFrameTest()
18         {
19             _server = new TestServer(new WebHostBuilder().UseStartup<Startup>());
20             _client = _server.CreateClient();
21         }
22 
23         [Fact]
24         public async Task GetAllTest()
25         {
26             var response = await _client.GetAsync("/api/users");
27             response.EnsureSuccessStatusCode();
28 
29             var responseString = await response.Content.ReadAsStringAsync();
30             IList<User> users = JsonConvert.DeserializeObject<IList<User>>(responseString);
31 
32             Assert.Equal(3, users.Count);
33         }
34 
35         [Theory]
36         [InlineData(1)]
37         [InlineData(2)]
38         [InlineData(3)]
39         public async Task GetTest(int id)
40         {
41             var response = await _client.GetAsync($"/api/users/{id}");
42             response.EnsureSuccessStatusCode();
43 
44             var responseString = await response.Content.ReadAsStringAsync();
45             User user = JsonConvert.DeserializeObject<User>(responseString);
46 
47             Assert.NotNull(user);
48         }
49     }
50 }
復(fù)制代碼

在cmd窗口執(zhí)行單元測(cè)試,查看測(cè)試結(jié)果

在上面的例子里,通過(guò)在一個(gè)工程里同時(shí)模擬了服務(wù)端(TestServer)和客戶端(HttpClient)的通信,從而達(dá)到了整體測(cè)試WebApi接口的目的。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多