高级特性完成

develop
bicijinlian 7 years ago
parent 097e03e34a
commit 6ddb521e79

@ -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

@ -27,6 +27,10 @@ namespace MoqStudy.Test
Mock<IFoo> mock = new Mock<IFoo>();
IFoo ifoo;
delegate void SubmitCallback(ref Bar bar);
public string IsLarge()
{
return Match.Create<string>(s => !String.IsNullOrEmpty(s) && s.Length > 10);
}
public MoqDemoTest()
{
ifoo = mock.Object;
@ -1203,48 +1207,65 @@ namespace MoqStudy.Test
#endregion
#region 高级特性
/// <summary>
/// 从 Mock 实例重新获得 Mock 对象
/// </summary>
[Fact]
public void Advanced_GetMockFromMocked_Test()
{
// get mock from a mocked instance
IFoo foo =new Mock<IFoo>().Object; // get mock instance somehow 以某种方式获取模拟实例
// 获取模拟实例
IFoo foo =new Mock<IFoo>().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);
}
/// <summary>
/// implementing multiple interfaces in mock
/// 在模拟中实现多个接口
/// </summary>
[Fact]
public void Advanced_MulttipleInteface_Test()
{
var mock = new Mock<IFoo>();
var disposableFoo = mock.As<IDisposable>();
// now the IFoo mock also implements IDisposable
// 现在IFoo 模拟也实现了IDisposable接口
disposableFoo.Setup(disposable => disposable.Dispose());
var mockDemo = new Mock<DemoHelper>();
var mockInterface = mockDemo.As<IDemo>();
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);
}
/// <summary>
/// implementing multiple interfaces in single mock
/// 在单个模拟中实现多个接口
/// </summary>
[Fact]
public void Advanced_MulttipleInteface_Single_Test()
{
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.Name).Returns("Fred");
mock.As<IDisposable>().Setup(disposable => disposable.Dispose());
var mockDemo = new Mock<DemoHelper>();
mockDemo.Setup(d => d.Add(1, 3))
.Returns(4);
var mockInterface = mockDemo.As<IDemo>()
.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);
}
/// <summary>
@ -1253,15 +1274,14 @@ namespace MoqStudy.Test
[Fact]
public void Advanced_CustomMatcher_Test()
{
//var mock = new Mock<IFoo>();
//var ifoo = mock.Object;
//mock.Setup(foo => foo.DoSomething(IsLarge()))
// .Throws<ArgumentException>();
var mockFoo = new Mock<IFoo>();
mockFoo.Setup(foo => foo.DoSomething(IsLarge()))
.Throws<ArgumentException>();
//Assert.False(ifoo.DoSomething("xyz"));
Assert.False(mockFoo.Object.DoSomething("xyz"));
//Assert.Throws<ArgumentException>(()=> { ifoo.DoSomething("a1234567890"); });
Assert.Throws<ArgumentException>(() => { mockFoo.Object.DoSomething("a1234567890"); });
}
#endregion

Loading…
Cancel
Save