1. <ul id="0c1fb"></ul>

      <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
      <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区

      RELATEED CONSULTING
      相關(guān)咨詢
      選擇下列產(chǎn)品馬上在線溝通
      服務(wù)時(shí)間:8:30-17:00
      你可能遇到了下面的問(wèn)題
      關(guān)閉右側(cè)工具欄

      新聞中心

      這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
      moq怎么用-創(chuàng)新互聯(lián)

      這篇文章給大家分享的是有關(guān)moq怎么用的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

      建網(wǎng)站原本是網(wǎng)站策劃師、網(wǎng)絡(luò)程序員、網(wǎng)頁(yè)設(shè)計(jì)師等,應(yīng)用各種網(wǎng)絡(luò)程序開(kāi)發(fā)技術(shù)和網(wǎng)頁(yè)設(shè)計(jì)技術(shù)配合操作的協(xié)同工作。創(chuàng)新互聯(lián)專業(yè)提供做網(wǎng)站、成都做網(wǎng)站,網(wǎng)頁(yè)設(shè)計(jì),網(wǎng)站制作(企業(yè)站、響應(yīng)式網(wǎng)站開(kāi)發(fā)、電商門戶網(wǎng)站)等服務(wù),從網(wǎng)站深度策劃、搜索引擎友好度優(yōu)化到用戶體驗(yàn)的提升,我們力求做到極致!

      Moq,就是Mock you。讀音可以讀成Mock~you。是Mock框架的一種。用于測(cè)試中的Mock測(cè)試。Mock是模擬的意思。Mock是模擬對(duì)象的一種技術(shù)。

      測(cè)試方法

      // 準(zhǔn)備 Mock IFoo 接口
      var mock = new Mock(); 
      // 配置準(zhǔn)備模擬的方法,當(dāng)調(diào)用接口中的 DoSomething 方法,并傳遞參數(shù) "bing" 的時(shí)候,返回 true
      mock.Setup(foo => foo.DoSomething("ping")).Returns(true); 
      // 方法的參數(shù)中使用了 out 參數(shù)
      // out arguments 
      var outString = "ack"; 
      // 當(dāng)調(diào)用 TryParse 方法的時(shí)候,out 參數(shù)返回 "ack", 方法返回 true, lazy evaluated 
      mock.Setup(foo => foo.TryParse("ping", out outString)).Returns(true); 
      // ref 參數(shù)
      var instance = new Bar(); 
      // 僅僅在使用 ref 調(diào)用的時(shí)候,才會(huì)匹配下面的測(cè)試
      mock.Setup(foo => foo.Submit(ref instance)).Returns(true); 
      // 當(dāng)方法返回值得時(shí)候,還可以訪問(wèn)返回的值
      // 這里可以使用多個(gè)參數(shù)
      mock.Setup(x => x.DoSomething(It.IsAny()))
      .Returns((string s) => s.ToLower()); 
      // 在被調(diào)用的時(shí)候拋出異常
      mock.Setup(foo => foo.DoSomething("reset")).Throws(); 
      mock.Setup(foo => foo.DoSomething("")).Throws(new ArgumentException("command"); 
      // 延遲計(jì)算返回的結(jié)果 
      mock.Setup(foo => foo.GetCount()).Returns(() => count); 
      // 在每一次調(diào)用的時(shí)候,返回不同的值 
      var mock = new Mock(); 
      var calls = 0; 
      mock.Setup(foo => foo.GetCountThing())
      .Returns(() => calls)
      .Callback(() => calls++); 
      // 第一次調(diào)用返回 0, 下一次是 1, 依次類推
      Console.WriteLine(mock.Object.GetCountThing());

      匹配參數(shù)

      // 任意值 
      mock.Setup(foo => foo.DoSomething(It.IsAny())).Returns(true); 
      // 提供的值必須匹配一個(gè)函數(shù), lazy evaluated 
      mock.Setup(foo => foo.Add(It.Is(i => i % 2 == 0))).Returns(true); 
      // 匹配一個(gè)范圍 
      mock.Setup(foo => foo.Add(It.IsInRange(0, 10, Range.Inclusive))).Returns(true); 
      // 匹配正則表達(dá)式
      mock.Setup(x => x.DoSomething(It.IsRegex("[a-d]+", RegexOptions.IgnoreCase))).Returns("foo");

      屬性

      // 普通屬性
      mock.Setup(foo => foo.Name).Returns("bar"); 
      // 多層的屬性
      mock.Setup(foo => foo.Bar.Baz.Name).Returns("baz"); 
      // 期望設(shè)置屬性的值為 "foo" 
      mock.SetupSet(foo => foo.Name = "foo"); 
      // 或者直接驗(yàn)證賦值 
      mock.VerifySet(foo => foo.Name = "foo");

      設(shè)置屬性,以便自動(dòng)跟蹤它的值

      // 開(kāi)始 "tracking" 屬性的 sets/gets 
      mock.SetupProperty(f => f.Name); 
      // 提供一個(gè)默認(rèn)的值
      mock.SetupProperty(f => f.Name, "foo"); 
      // 現(xiàn)在,你可以: 
      IFoo foo = mock.Object; 
      // 保存的值 
      Assert.Equal("foo", foo.Name); 
      // 重新設(shè)置一個(gè)值
      foo.Name = "bar"; 
      Assert.Equal("bar", foo.Name);

      還可以準(zhǔn)備所有的屬性

      mock.SetupAllProperties();

      事件

      // 拋出一個(gè)事件 
      mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue)); 
      // 多層的后代中的事件 
      mock.Raise(m => m.Child.First.FooEvent += null, new FooEventArgs(fooValue)); 
      // 當(dāng) Submit 方法被調(diào)用的時(shí)候,拋出一個(gè)事件 
      mock.Setup(foo => foo.Submit()).Raises(f => f.Sent += null, EventArgs.Empty); 
      // 拋出異常將會(huì)觸發(fā)對(duì)象底層的行為
      // 你可能需要在后面進(jìn)行斷言處理
      // 拋出一個(gè)自定義的事件
      public delegate void MyEventHandler(int i, bool b); 
      public interface IFoo { event MyEventHandler MyEvent; } 
      var mock = new Mock(); 
      ... 
      // 傳遞自定義的事件參數(shù)
      mock.Raise(foo => foo.MyEvent += null, 25, true);

      回調(diào)

      var mock = new Mock(); 
      mock.Setup(foo => foo.Execute("ping"))
      .Returns(true)
      .Callback(() => calls++); 
      // 使用調(diào)用的參數(shù) 
      mock.Setup(foo => foo.Execute(It.IsAny()))
      .Returns(true)
      .Callback((string s) => calls.Add(s)); 
      // 使用泛型語(yǔ)法 
      mock.Setup(foo => foo.Execute(It.IsAny()))
      .Returns(true)
      .Callback(s => calls.Add(s)); 
      // 使用多個(gè)參數(shù)
      mock.Setup(foo => foo.Execute(It.IsAny(), It.IsAny()))
      .Returns(true)
      .Callback((i, s) => calls.Add(s)); 
      // 調(diào)用之前和之后的回調(diào) 
      mock.Setup(foo => foo.Execute("ping"))
      .Callback(() => Console.WriteLine("Before returns"))
      .Returns(true)
      .Callback(() => Console.WriteLine("After returns"));

      驗(yàn)證

      mock.Verify(foo => foo.Execute("ping")); 
      // 在驗(yàn)證失敗的時(shí)候,提供自定義的錯(cuò)誤提示信息 
      mock.Verify(foo => foo.Execute("ping"), "When doing operation X, the service should be pinged always"); 
      // 從沒(méi)有被調(diào)用的方法 
      mock.Verify(foo => foo.Execute("ping"), Times.Never()); 
      // 至少調(diào)用過(guò)一次 
      mock.Verify(foo => foo.Execute("ping"), Times.AtLeastOnce()); 
      mock.VerifyGet(foo => foo.Name); 
      // 驗(yàn)證對(duì)屬性的賦值. 
      mock.VerifySet(foo => foo.Name); 
      // 驗(yàn)證對(duì)于屬性設(shè)置特定的值 
      mock.VerifySet(foo => foo.Name ="foo"); 
      // 驗(yàn)證匹配的參數(shù) 
      mock.VerifySet(foo => foo.Value = It.IsInRange(1, 5, Range.Inclusive));

      自定義 Mock 行為

      Mock 的行為分為嚴(yán)格的 Strict 和寬松的 Loose, 默認(rèn)為寬松的。在嚴(yán)格模式下,使用任何沒(méi)有被指定的行為,都將會(huì)拋出異常,寬松模式下,不會(huì)拋出任何異常,方法將會(huì)返回默認(rèn)值或者空的數(shù)組等等。

      var mock = new Mock(MockBehavior.Strict);

      如果沒(méi)有重寫基類的實(shí)現(xiàn),默認(rèn)將不會(huì)調(diào)用基類,在 Mock Web/Html 控件的是必須的。

      var mock = new Mock { CallBase = true };

      創(chuàng)造自動(dòng)遞歸的 Mock, Mock 對(duì)象對(duì)于它的任何成員將會(huì)返回一個(gè)新的 Mock 對(duì)象。

      var mock = new Mock { DefaultValue = DefaultValue.Mock }; 
      // 默認(rèn)是 DefaultValue.Empty 
      // 現(xiàn)在這個(gè)屬性將會(huì)返回一個(gè)新的 Mock 對(duì)象 
      IBar value = mock.Object.Bar; 
      // 可以使用返回的 Mock 對(duì)象, 后即對(duì)屬性的訪問(wèn)返回相同的對(duì)象實(shí)例
      // 這就允許我們可以進(jìn)行后繼的設(shè)置 
      // set further expectations on it if we want 
      var barMock = Mock.Get(value); 
      barMock.Setup(b => b.Submit()).Returns(true);

      中心化的 Mock 實(shí)例創(chuàng)建和管理:你可以在一個(gè)地方使用 MockRepository 創(chuàng)建和驗(yàn)證所有的 Mock 對(duì)象,設(shè)置 MockBehavior, CallBse 和 DefaultValue 約束。

      var factory = new MockFactory(MockBehavior.Strict) { DefaultValue = DefaultValue.Mock }; 
      // 創(chuàng)建 Mock 對(duì)象
      var fooMock = factory.Create(); 
      // 在創(chuàng)建的時(shí)候重寫倉(cāng)庫(kù)的設(shè)置 
      var barMock = factory.Create(MockBehavior.Loose); 
      // 驗(yàn)證通過(guò)倉(cāng)庫(kù)創(chuàng)建的對(duì)象 
      factory.Verify();

      其它

      // 用在測(cè)試用例的開(kāi)始 
      using Moq.Protected() 
      // 測(cè)試中
      var mock = new Mock(); mock.Protected()
      .Setup("Execute")
      .Returns(5); 
      // 如果用到了參數(shù)匹配, 必須使用 ItExpr 來(lái)代替 It 
      // 以后計(jì)劃改進(jìn)
      mock.Protected()
      .Setup("Execute", ItExpr.IsAny())
      .Returns(true);

      高級(jí)特性

      // 從 Mock 實(shí)例重新獲得 Mock 對(duì)象
      IFoo foo = // get mock instance somehow 
      var fooMock = Mock.Get(foo); 
      fooMock.Setup(f => f.Submit()).Returns(true); 
      // 實(shí)現(xiàn)多個(gè)接口 
      var foo = new Mock(); 
      var disposableFoo = foo.As(); 
      // 現(xiàn)在 IFoo mock 已經(jīng)實(shí)現(xiàn)了接口 IDisposable :) disposableFoo.Setup(df => df.Dispose()); 
      // 定制匹配 
      mock.Setup(foo => foo.Submit(IsLarge())).Throws(); ... 
      public string IsLarge() 
      {
      return Match.Create(s => !String.IsNullOrEmpty(s) && s.Length > 100); 
      }

      感謝各位的閱讀!關(guān)于“moq怎么用”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!


      網(wǎng)頁(yè)名稱:moq怎么用-創(chuàng)新互聯(lián)
      當(dāng)前路徑:http://www.ef60e0e.cn/article/djiiph.html
      99热在线精品一区二区三区_国产伦精品一区二区三区女破破_亚洲一区二区三区无码_精品国产欧美日韩另类一区
      1. <ul id="0c1fb"></ul>

        <noscript id="0c1fb"><video id="0c1fb"></video></noscript>
        <noscript id="0c1fb"><listing id="0c1fb"><thead id="0c1fb"></thead></listing></noscript>

        涡阳县| 阳新县| 新平| 岳阳市| 阿克陶县| 鸡泽县| 肇东市| 竹溪县| 库尔勒市| 安新县| 运城市| 荆州市| 宁国市| 松滋市| 海兴县| 天峨县| 民丰县| 库伦旗| 安多县| 沛县| 凤城市| 肃宁县| 三穗县| 曲水县| 荔浦县| 桦南县| 丹东市| 桂平市| 昭平县| 习水县| 诸城市| 隆子县| 中宁县| 凤冈县| 通道| 临西县| 电白县| 邹平县| 庆阳市| 朝阳县| 克拉玛依市|