hpi*_*que 52 unit-testing mocking swift
你如何在Swift中模拟一个对象?
该Mirror协议听起来很有希望,但它现在做的并不多.
到目前为止,我发现的唯一方法是子类化并覆盖模拟类的所有方法.这当然不是真正的模仿,远非理想,还有很多工作.
还有其他想法吗?
从来源:
我可以使用语言桥接功能使用OCMock吗?
是的,但有局限性.如果你很勇敢.截至目前,这是高度实验性的.无法保证OCMock将完全支持Swift.
已知限制:
Dre*_*pre 29
NSHipster涉及Swift中的语言功能,这使得外部模拟库不那么必要:
在Swift中,类可以在函数的定义中声明,允许模拟对象非常自包含.只需声明一个模拟内部类,覆盖和[原文如此]必要的方法:
func testFetchRequestWithMockedManagedObjectContext() {
class MockNSManagedObjectContext: NSManagedObjectContext {
override func executeFetchRequest(request: NSFetchRequest!, error: AutoreleasingUnsafePointer<NSError?>) -> [AnyObject]! {
return [["name": "Johnny Appleseed", "email": "johnny@apple.com"]]
}
}
...
}
Run Code Online (Sandbox Code Playgroud)
在本地范围内创建外部依赖的子类的能力加上XCTestExpectation解决了很多相同的问题OCMock.
像OCMock提供的库非常有用的一件事是它的"验证"方法,以确保调用模拟类.可以手动添加它,但自动添加很好.
我通过将所有内容包装在协议中来创建模拟类。我手动滚动一个模拟类以符合所讨论的协议,如下所示:
protocol Dog: class {
var name: String { get }
func bark()
}
class DogImpl: Dog {
var name: String
init(name: String) {
self.name = name
}
func bark() {
print("Bark!")
}
}
class DogMock: Dog {
var name = "Mock Dog"
var didBark = false
func bark() {
didBark = true
}
}
Run Code Online (Sandbox Code Playgroud)
我将其与依赖项注入结合使用以实现完整的测试范围。这是很多样板,但是到目前为止,这种方法我还没有遇到任何问题。
关于子类模拟,您将遇到final类或类具有非平凡的初始化器的麻烦。
| 归档时间: |
|
| 查看次数: |
14792 次 |
| 最近记录: |