moq模拟属性
源代码public class Customer
{
public virtual int a { get; set; }
public virtual string b { get; set; }
}
测试代码
var customer = new Mock<Customer>();
customer.SetupProperty(p => p.a, 5);
customer.Setup(p=>p.a).Returns(3);
Assert.AreEqual(4, customer.Object.a);
注意
customer.SetupProperty(p=>p.a,5);等同于customer.Setup(p=>p.a).Returns(5);
moq模拟方法
源代码 public interface Customer
{
void a();
string b();
string c(ref string cs);
string d(string ds, out string dso);
}
测试代码
var cs = "i am c";
var dso = "";
var customer = new Mock<Customer>();
customer.Setup(p=>p.a());
customer.Setup(p=>p.b()).Returns("i am b");
customer.Setup(p=>p.c(ref cs)).Returns((string s)=>s);
customer.Setup(p=>p.d("i am d",out dso)).Returns("i am d 2");
customer.Object.a();
Assert.AreEqual("i am b", customer.Object.b());
Assert.AreEqual("i am c", customer.Object.c(ref cs));
Assert.AreEqual("i am d 2", customer.Object.d("i am d", out dso));
Assert.AreEqual("", dso);
moq模拟异常
源代码 public interface Customer
{
void ShowException(int a);
}
测试代码
var customer = new Moq.Mock<Customer>();
customer.Setup(p => p.ShowException(0)).Throws(new Exception("i a exception"));
customer.Object.ShowException(0);
moq模拟调用时赋值
源代码
public interface Customer
{
void A();
}
测试代码
var customer = new Moq.Mock<Customer>();
int a = 0;
customer.Setup(p=>p.A()).Callback(()=>a++);
customer.Object.A();
Assert.AreEqual(1,a);
moq模拟参数过滤
源代码
public interface Customer
{
int A(int a);
}
测试代码
var customer = new Mock<Customer>();
customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2);
Assert.AreEqual(2,customer.Object.A(5));
测试代码customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2);表示当参数是偶数时,返回2
It用于参数约束,常用的约束有
moq模拟回调函数
- It.IsInRange<T>:表示参数是否在某个范围
- It.IsRegex<T>:用正则表达式限制参数
- 等等....
见moq模拟调用时赋值
moq检测功能源代码
public interface Customer
{
int A(int a);
}
测试代码
var customer = new Mock<Customer>();
customer.Setup(p=>p.A(It.Is<int>(i=>i%2==0))).Returns(2).Verifiable();
customer.Object.A(4);
customer.Verify();
通过Verifiable()将A()函数标记,只有A()函数被调用,customer.Verify()才可以通过!