diff --git a/MoqStudy.MockModel/DemoModel/DemoHelper.cs b/MoqStudy.MockModel/DemoModel/DemoHelper.cs index c8a1c66..e6b1aa7 100644 --- a/MoqStudy.MockModel/DemoModel/DemoHelper.cs +++ b/MoqStudy.MockModel/DemoModel/DemoHelper.cs @@ -6,8 +6,22 @@ using System.Threading.Tasks; namespace MoqStudy.MockModel { - public class DemoHelper + public class DemoHelper : IDemo { + public virtual int Add(int a, int b) + { + return a = b; + } + + public int Minus(int a, int b) + { + return a - b; + } + } + + public interface IDemo + { + int Minus(int a, int b); } public interface CommandBaseProtectedMembers diff --git a/MoqStudy.Test/MoqDemoTest.cs b/MoqStudy.Test/MoqDemoTest.cs index bcfd928..d083bbe 100644 --- a/MoqStudy.Test/MoqDemoTest.cs +++ b/MoqStudy.Test/MoqDemoTest.cs @@ -27,6 +27,10 @@ namespace MoqStudy.Test Mock mock = new Mock(); IFoo ifoo; delegate void SubmitCallback(ref Bar bar); + public string IsLarge() + { + return Match.Create(s => !String.IsNullOrEmpty(s) && s.Length > 10); + } public MoqDemoTest() { ifoo = mock.Object; @@ -1203,48 +1207,65 @@ namespace MoqStudy.Test #endregion #region 高级特性 + + /// + /// 从 Mock 实例重新获得 Mock 对象 + /// [Fact] public void Advanced_GetMockFromMocked_Test() { - // get mock from a mocked instance - IFoo foo =new Mock().Object; // get mock instance somehow 以某种方式获取模拟实例 + // 获取模拟实例 + IFoo foo =new Mock().Object; + + //再次转换成模拟对象 var fooMock = Mock.Get(foo); + + //进行设置 fooMock.Setup(f => f.GetCount()).Returns(42); - Assert.Equal(42, fooMock.Object.GetCount()); - } + //使用 + var getCount = fooMock.Object.GetCount(); + //断言 + Assert.Equal(42,getCount); + } /// - /// implementing multiple interfaces in mock /// 在模拟中实现多个接口 /// [Fact] public void Advanced_MulttipleInteface_Test() { - var mock = new Mock(); - - var disposableFoo = mock.As(); - // now the IFoo mock also implements IDisposable - // 现在,IFoo 模拟也实现了IDisposable接口 - disposableFoo.Setup(disposable => disposable.Dispose()); + var mockDemo = new Mock(); + var mockInterface = mockDemo.As(); + mockInterface.Setup(d => d.Minus(5, 1)) + .Returns(4); - var ifoo = disposableFoo.Object; - - ifoo.Dispose(); - //todo:设计测试方法 + var minusValue = mockInterface.Object.Minus(5, 1); + Assert.Equal(4, minusValue); } /// - /// implementing multiple interfaces in single mock /// 在单个模拟中实现多个接口 /// [Fact] public void Advanced_MulttipleInteface_Single_Test() { - var mock = new Mock(); - mock.Setup(foo => foo.Name).Returns("Fred"); - mock.As().Setup(disposable => disposable.Dispose()); + var mockDemo = new Mock(); + + mockDemo.Setup(d => d.Add(1, 3)) + .Returns(4); + + var mockInterface = mockDemo.As() + .Setup(d => d.Minus(5, 1)) + .Returns(4); + + //现在mockDemo也实现了IDemo接口,同时有两个方法:原Add()和 IDemo接口方法 Minus() + var aadValue = mockDemo.Object.Add(1, 3); + var minusValue = mockDemo.Object.Minus(5, 1); + + Assert.Equal(4, aadValue); + Assert.Equal(4, minusValue); } /// @@ -1253,15 +1274,14 @@ namespace MoqStudy.Test [Fact] public void Advanced_CustomMatcher_Test() { - //var mock = new Mock(); - //var ifoo = mock.Object; - //mock.Setup(foo => foo.DoSomething(IsLarge())) - // .Throws(); + var mockFoo = new Mock(); + + mockFoo.Setup(foo => foo.DoSomething(IsLarge())) + .Throws(); - //Assert.False(ifoo.DoSomething("xyz")); + Assert.False(mockFoo.Object.DoSomething("xyz")); - //Assert.Throws(()=> { ifoo.DoSomething("a1234567890"); }); - + Assert.Throws(() => { mockFoo.Object.DoSomething("a1234567890"); }); } #endregion