日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

xUnit-Moq框架

發(fā)布時間:2023/12/20 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 xUnit-Moq框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

基于上一次的單元測試-xUnit進(jìn)行

Models文件夾

Staff類修改為:

public class Staff

{

??? public int Id { get; set; }

??? public string Name { get; set; }

??? public string State { get; set; }

??? public int Age { get; set; }

}

創(chuàng)建一個IRepository接口

public interface IRepository

{

IEnumerable<Staff> Staffs{ get; }

}

? ? ? ? ? ? ?創(chuàng)建一個SimpleRepository類實現(xiàn)IRepository接口

public class SimpleRepository : IRepository

{

??? public IEnumerable<Staff> Staffs=> new Staff[]

??? {

??????? new Staff(){ Id = 1, Name = "張三", State = "在職", Age = 18 },

??????? new Staff(){ Id = 2, Name = "李四", State = "離職", Age = 20 },

??????? new Staff(){ Id = 10, Name = "王五", State = "在職", Age = 36 },

??????? new Staff(){ Id = 8, Name = "血友病", State = "在職", Age = 18 }

??? };

}

這樣的好處:

  • 實體類更加直觀
  • 假設(shè)SimpleRepository類里的數(shù)據(jù)是Sql的數(shù)據(jù),我們測試時定義假數(shù)據(jù)實現(xiàn)接口,因為接口是一種規(guī)范并且可以進(jìn)行里氏轉(zhuǎn)換
  • Controllers文件夾

    HomeController 內(nèi)容修改為

    public class HomeController : Controller

    {

    ??? private IRepository repository = new SimpleRepository();

    ?

    ??? public IRepository Repository {

    ??????? get => repository ;

    ??????? set => repository = value;

    ??? }

    ?

    ??? public IActionResult Index()

    ??? {

    ??????? return View(Repository.Staffs.Where(x => x.State == "在職"));

    ??? }

    }

    Staffitems.Tests項目

    在NuGet管理器種添加Moq軟件包

    Moq是什么? ==== 是一個用于在應(yīng)用程序種創(chuàng)建組件的仿冒實現(xiàn)的軟件包

    Moq有何用? ====Moq框架是的為單元測試創(chuàng)建仿冒組件以隔離應(yīng)用程序的部件變得更容易

    有什么替代品? ===== 有很多替代品,包括NSubstitue和FakeItEasy。所有這些框架都提供類似的功能,可在它們之間進(jìn)行選擇

    ?

    HomeControllerTests類中使用Moq

    ????????????????紅色部分為新增或者修改

    ????????????????綠色部分為解釋

    public class HomeControllerTests

    {

    ??? [Fact]

    ??? public void IndexActionModelIsComplete2()

    ??? {

    ??????? //創(chuàng)建Mocking

    ??????? var mock = new Mock<IRepository>();

    ?

    ??????? //SetupGet:為調(diào)用屬性getter指定假數(shù)據(jù)的設(shè)置。

    ??? //當(dāng)Products被讀取時返回Returns方法里的結(jié)果

    ??????? mock.SetupGet(x => x.Staffs).Returns(new[]

    ??????? {

    ??????????? new Staff{ Name ="z1",Age = 5, State = "在職" },

    ??????????? new Staff{ Name ="z2",Age = -3232 ,State = "在職" },

    ??????????? new Staff{ Name ="z3",Age = 99999 ,State = "在職" }

    ??????? });

    ?

    ??????? //獲取Home控制器,并重新設(shè)置該Repository的值

    ??????? //Repository一開始指向與SimpleRepository

    ??????? //現(xiàn)在指向與我們在上面定義的假數(shù)據(jù)

    ??????? var controll = new HomeController() { Repository = mock.Object };

    ???

    ??? //調(diào)用HomeControll中的Index()方法并獲取返回的類型

    ??????? var model = (controll.Index() as ViewResult).ViewData.Model

    ??????????? as IEnumerable<Staff>;

    ???

    ??? //對比預(yù)料值與實際值是否一致

    ??????? Assert.Equal(

    ??????????? controll.Repository.Staffs.Where(x => x.State == "在職"),

    ??????????? model,

    ??????????? Comparer.Get<Staff>((a, b) => a.Name == b.Name && a.State == b.State && a.Id == b.Id)

    ??????? );

    ??? }

    }

    測試Index()方法只執(zhí)行了一次

    [Fact]

    public void IndexActionModelIsComplete3()

    {

    ??? var controller = new HomeController();

    ??? var mock = new Mock<IRepository>();

    ?

    ??? mock.SetupGet(m => m.Staffs).Returns(new[]

    ??? {

    ??????? new Staff{ Name ="z1",Age = 5, State = "在職" },

    ??????? new Staff{ Name ="z2",Age = -3232 ,State = "在職" },

    ??????? new Staff{ Name ="z3",Age = 99999 ,State = "在職" }

    ??? });

    ?

    ??? controller.Repository = mock.Object;

    ?

    ??? //執(zhí)行Index()方法

    ??? var result = controller.Index();

    ??? var result2 = controller.Index();

    ??? var result3 = controller.Index();

    ?

    ??? //驗證是否在模擬上讀取了Products屬性。并且只讀取了一次(Times.Once)

    ??? mock.VerifyGet(m => m.Staffs, Times.Once);

    }

    ????????????????刪除以下代碼就行了

    var result2 = controller.Index();

    var result3 = controller.Index();

    總結(jié)

    以上是生活随笔為你收集整理的xUnit-Moq框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。