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