Moq 1 My Cases 1.1 簡單入門 2 Reference 2.1 Methods 2.2 Matching Arguments 2.3 Properties 2.4 Events 2.5 Callbacks 2.6 Verification 2.7 Customizing Mock B ...
Moq
1 My Cases
1.1 簡單入門
2 Reference
2.1 Methods
2.2 Matching Arguments
2.3 Properties
2.4 Events
2.5 Callbacks
2.6 Verification
2.7 Customizing Mock Behavior
2.8 Miscellaneous
2.9 Advanced Features
2.10 LINQ to Mocks
3 FAQ
3.1 static class/method
1 My Cases
1.1 簡單入門
// 假定我有一個 MyFactory 用來創建 MyInterface 實例
// 創建 MyFactory 的 Mock 對象
var mockFactory = new Mock<MyFactory>();
// 創建 MyInterface 的 Mock 實例
var mockInstance = new Mock<MyInterface>();
// 使用 Moq 實現如果調用 MyInstance.DoSomething(bool) 方法無論傳入參數為何值一概拋出 MyException 異常
mockInstance.Setup(c => c.DoSomething(It.IsAny<bool>()))
.Throws(new MyException("my exception message"));
// 使用 Moq 實現 MyFactory 的 Mock 實例第一次調用 CreateInstance(string) 方法時返回 MyInterface 的 Mock 實例
// 第二次及以後調用則返回真正的 MyInstance 實例
mockFactory.SetupSequence(f => f.CreateInstance(It.IsAny<string>()))
.Returns(mockInstance.Object)
.Returns(new MyInstance("real object"));
client.Factory = mockFactory.Object;
2 Reference
Please refer to Moq Quickstart
Moq is intended to be simple to use, strongly typed (no magic strings!, and therefore full compiler-verified and refactoring-friendly) and minimalistic (while still fully functional!).
2.1 Methods
using Moq;
// Assumptions:
public interface IFoo
{
Bar Bar { get; set; }
string Name { get; set; }
int Value { get; set; }
bool DoSomething(string value);
bool DoSomething(int number, string value);
string DoSomethingStringy(string value);
bool TryParse(string value, out string outputValue);
bool Submit(ref Bar bar);
int GetCount();
bool Add(int value);
}
public class Bar
{
public virtual Baz Baz { get; set; }
public virtual bool Submit() { return false; }
}
public class Baz
{
public virtual string Name { get; set; }
}
var mock = new Mock<IFoo>();
mock.Setup(foo => foo.DoSomething("ping")).Returns(true);
// out arguments
var outString = "ack";
// TryParse will return true, and the out argument will return "ack", lazy evaluated
mock.Setup(foo => foo.TryParse("ping", out outString)).Returns(true);
// ref arguments
var instance = new Bar();
// Only matches if the ref argument to the invocation is the same instance
mock.Setup(foo => foo.Submit(ref instance)).Returns(true);
// access invocation arguments when returning a value
mock.Setup(x => x.DoSomethingStringy(It.IsAny<string>()))
.Returns((string s) => s.ToLower());
// Multiple parameters overloads available
// throwing when invoked with specific parameters
mock.Setup(foo => foo.DoSomething("reset")).Throws<InvalidOperationException>();
mock.Setup(foo => foo.DoSomething("")).Throws(new ArgumentException("command"));
// lazy evaluating return value
var count = 1;
mock.Setup(foo => foo.GetCount()).Returns(() => count);
// returning different values on each invocation
var mock =