|
|
|
@ -427,31 +427,46 @@ namespace MoqStudy.Test
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 期望(等同于检查),属性已经被设置为指定的值
|
|
|
|
|
/// 用法暂不明确:可以用VerifySet替代本功能
|
|
|
|
|
/// 期望属性被赋值为指定的值
|
|
|
|
|
/// 可由VerifySet替代
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Property_SetupSet_Test()
|
|
|
|
|
{
|
|
|
|
|
mock //todo:用法不明确,待查
|
|
|
|
|
mock //期望属性被赋值为指定的值
|
|
|
|
|
//可以使用 VerifySet 替代
|
|
|
|
|
.SetupSet(foo => foo.Name = "foo");
|
|
|
|
|
.SetupSet(foo => foo.Name = "ping")
|
|
|
|
|
//使设置可以验证,如果没有此设置,则SetupSet设置,无从知道SetupSet设置的效果
|
|
|
|
|
.Verifiable();
|
|
|
|
|
|
|
|
|
|
//属性值不为指定的值时,验证时异常
|
|
|
|
|
Assert.Throws<MockException>(()=>mock.Verify());
|
|
|
|
|
|
|
|
|
|
Assert.Equal(1,2);
|
|
|
|
|
//属性值赋值为指定值时,验证通过
|
|
|
|
|
//或者 加上 mock.Setup(f => f.Name).Returns("ping");
|
|
|
|
|
ifoo.Name = "ping";
|
|
|
|
|
mock.Verify();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 验证设置属性
|
|
|
|
|
/// 用法暂不明确:可以用VerifySet替代本功能
|
|
|
|
|
/// 验证属性读取
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Property_SetupGet_Test()
|
|
|
|
|
{
|
|
|
|
|
mock //todo:用法不明确,待查
|
|
|
|
|
.SetupGet(foo => foo.Name);
|
|
|
|
|
|
|
|
|
|
Assert.True(1==2);
|
|
|
|
|
mock //期望属性值被读取
|
|
|
|
|
//可以使用 VerifyGet 替代
|
|
|
|
|
.SetupGet(foo => foo.Name)
|
|
|
|
|
//使设置可以验证,如果没有此设置,则SetupGet设置,无从知道SetupSet设置的效果
|
|
|
|
|
.Verifiable();
|
|
|
|
|
|
|
|
|
|
//属性值未被读取时,验证时异常
|
|
|
|
|
Assert.Throws<MockException>(() => mock.Verify());
|
|
|
|
|
|
|
|
|
|
//属性值被读取时,验证通过
|
|
|
|
|
//或者加上 mock.Setup(f => f.Name).Returns("ping");
|
|
|
|
|
var getName = ifoo.Name;
|
|
|
|
|
mock.Verify();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
@ -792,8 +807,6 @@ namespace MoqStudy.Test
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Verify_AtLeastOnce_Test()
|
|
|
|
|
{
|
|
|
|
|
var mock = new Mock<IFoo>();
|
|
|
|
|
var ifoo = mock.Object;
|
|
|
|
|
MockException mockException = null;
|
|
|
|
|
var customInfo = "custom info";
|
|
|
|
|
try
|
|
|
|
@ -832,8 +845,6 @@ namespace MoqStudy.Test
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Verify_Propertie_Get_Test()
|
|
|
|
|
{
|
|
|
|
|
var mock = new Mock<IFoo>();
|
|
|
|
|
var ifoo = mock.Object;
|
|
|
|
|
MockException mockException = null;
|
|
|
|
|
var customInfo = "custom info";
|
|
|
|
|
try
|
|
|
|
@ -855,7 +866,7 @@ namespace MoqStudy.Test
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
//读取1次属性
|
|
|
|
|
var rr = ifoo.Name;
|
|
|
|
|
var getName = ifoo.Name;
|
|
|
|
|
mock.VerifyGet(foo => foo.Name, customInfo);
|
|
|
|
|
mockException = null;
|
|
|
|
|
}
|
|
|
|
@ -874,8 +885,6 @@ namespace MoqStudy.Test
|
|
|
|
|
[Fact]
|
|
|
|
|
public void Verify_Propertie_Set_Test()
|
|
|
|
|
{
|
|
|
|
|
var mock = new Mock<IFoo>();
|
|
|
|
|
var ifoo = mock.Object;
|
|
|
|
|
MockException mockException = null;
|
|
|
|
|
var customInfo = "custom info";
|
|
|
|
|
try
|
|
|
|
@ -987,7 +996,6 @@ namespace MoqStudy.Test
|
|
|
|
|
#region 定制模拟行为
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Customizing Mock Behavior
|
|
|
|
|
/// 定制Mock模式
|
|
|
|
|
/// 默认模式,等同宽松模式:未设置的Mock行为或属性保持默认值或默认行为
|
|
|
|
|
/// 严格模式:未设置的Mock行为或属性,不可使用(异常)
|
|
|
|
@ -1000,7 +1008,6 @@ namespace MoqStudy.Test
|
|
|
|
|
Assert.Null(looseOrDefaultMock.Object.Name);
|
|
|
|
|
Assert.False(looseOrDefaultMock.Object.Add(1));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//严格模式
|
|
|
|
|
var strictMock = new Mock<IFoo>(MockBehavior.Strict);
|
|
|
|
|
|
|
|
|
@ -1009,27 +1016,40 @@ namespace MoqStudy.Test
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// Callbase
|
|
|
|
|
/// 使用Callbase
|
|
|
|
|
/// 如果没有重写基类的实现,默认将不会调用基类,在 Mock Web/Html 控件的是必须的
|
|
|
|
|
/// http://www.360doc.com/content/14/0729/09/10504424_397815601.shtml
|
|
|
|
|
/// 使用Callbase,调用真实对象的实际方法或属性
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void CustomMock_Callbase_Test()
|
|
|
|
|
{
|
|
|
|
|
/*
|
|
|
|
|
Invoke base class implementation if no expectation overrides the member
|
|
|
|
|
(a.k.a. "Partial Mocks" in Rhino Mocks): default is false.
|
|
|
|
|
(this is required if you are mocking Web/Html controls in System.Web!)
|
|
|
|
|
*/
|
|
|
|
|
//如果没有重写基类的实现,默认将不会调用基类,在 Mock Web/Html 控件的是必须的。
|
|
|
|
|
var mock = new Mock<IFoo> { CallBase = true };
|
|
|
|
|
|
|
|
|
|
//todo:需要验证
|
|
|
|
|
var mock = new Mock<CallBaseHelper> { CallBase = true };
|
|
|
|
|
var actual = mock.Object;
|
|
|
|
|
|
|
|
|
|
mock //参数长度大于5,调用真实代码,返回参数的大写形式
|
|
|
|
|
.Setup(m => m.NameFormat(It.Is<string>(f => f.Length > 5)))
|
|
|
|
|
.CallBase();
|
|
|
|
|
|
|
|
|
|
mock //参数长度小于等于5,模拟返回值,返回参数的小写形式
|
|
|
|
|
.Setup(m => m.NameFormat(It.Is<string>(f => f.Length <= 5)))
|
|
|
|
|
.Returns<string>(arg=>arg.ToLower());
|
|
|
|
|
|
|
|
|
|
var length3 = "AbC";
|
|
|
|
|
var length4 = "Abcd";
|
|
|
|
|
var length5 = "aBced";
|
|
|
|
|
|
|
|
|
|
var length6 = "Acccde";
|
|
|
|
|
var length10 = "aBcdefghig";
|
|
|
|
|
|
|
|
|
|
Assert.Equal(length3.ToLower(), actual.NameFormat(length3));
|
|
|
|
|
Assert.Equal(length4.ToLower(), actual.NameFormat(length4));
|
|
|
|
|
Assert.Equal(length5.ToLower(), actual.NameFormat(length5));
|
|
|
|
|
|
|
|
|
|
Assert.Equal(length6.ToUpper(), actual.NameFormat(length6));
|
|
|
|
|
Assert.Equal(length10.ToUpper(), actual.NameFormat(length10));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 创造自动递归的Mock, Mock 对象对于它的任何成员将会返回一个新的 Mock 对象。
|
|
|
|
|
/// 创造自动递归的Mock
|
|
|
|
|
/// Mock对象对于它的任何成员将会返回一个新的 Mock 对象。
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void CustomMock_Automatic_Test()
|
|
|
|
@ -1052,20 +1072,28 @@ namespace MoqStudy.Test
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
/// 中心化的 Mock 实例创建和管理:你可以在一个地方使用 MockRepository 创建和验证所有的 Mock 对象,设置 MockBehavior, CallBse 和 DefaultValue 约束。
|
|
|
|
|
/// 中心化的 Mock 实例创建和管理
|
|
|
|
|
/// 你可以在一个地方使用 MockRepository 创建和验证所有的 Mock 对象,设置 MockBehavior, CallBse 和 DefaultValue 约束。
|
|
|
|
|
/// </summary>
|
|
|
|
|
[Fact]
|
|
|
|
|
public void CustomMock_MockRepository_Test()
|
|
|
|
|
{
|
|
|
|
|
var repository = new MockRepository(MockBehavior.Strict) { DefaultValue = DefaultValue.Mock };
|
|
|
|
|
var repository = new MockRepository(MockBehavior.Strict)
|
|
|
|
|
{
|
|
|
|
|
DefaultValue = DefaultValue.Mock,
|
|
|
|
|
CallBase = false,
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Create a mock using the repository settings
|
|
|
|
|
// 使用中心化设置创建 Mock 对象
|
|
|
|
|
var fooMock = repository.Create<IFoo>();
|
|
|
|
|
|
|
|
|
|
// Create a mock overriding the repository settings
|
|
|
|
|
// 创建覆盖中心化设置的 Mock 对象
|
|
|
|
|
var barMock = repository.Create<Bar>(MockBehavior.Loose);
|
|
|
|
|
|
|
|
|
|
// Verify all verifiable expectations on all mocks created through the repository
|
|
|
|
|
// 验证
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
repository.Verify();
|
|
|
|
@ -1076,8 +1104,6 @@ namespace MoqStudy.Test
|
|
|
|
|
Assert.Null(ex);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endregion
|
|
|
|
|
|
|
|
|
|
#region 其它
|
|
|
|
|