ios - stub [[SomeClazz alloc] init] 不起作用,但接受的答案说它应该起作用
<p><p>我的被测函数很简单:</p>
<pre><code>@implementation MyHandler
...
-(void) processData {
DataService *service = [ init];
NSDictionary *data = ;
;
}
@end
</code></pre>
<p>我使用 <a href="http://ocmock.org/reference/" rel="noreferrer noopener nofollow">OCMock 3</a>对其进行单元测试。 </p>
<p>我需要<strong> stub </strong> <code>[ init]</code> 来返回一个<strong>模拟实例</strong>,我尝试了<a href="https://stackoverflow.com/questions/18503604/how-to-mock-an-object-with-ocmock-which-isnt-passed-as-a-parameter-to-method" rel="noreferrer noopener nofollow">answer from this question</a> (这是一个公认的答案) stub<code>[ init]</code>:</p>
<pre><code>// Stub 'alloc init' to return mocked DataService instance,
// exactly the same way as the accepted answer told
id DataServiceMock = OCMClassMock();
OCMStub().andReturn(DataServiceMock);
OCMStub().andReturn(DataServiceMock);
// run function under test
;
// verify is invoked
OCMVerify();
</code></pre>
<p>我在被测函数中设置了断点,我确定在运行单元测试时会调用 <code></code>,但是我上面的测试代码(OCMVerify)失败了。为什么? </p>
<p>是不是因为被测函数没有使用我的<strong>mocked</strong> <code>DataService</code>?但是该问题中接受的答案表明它应该有效。我现在糊涂了……</p>
<p>我想知道如何使用 OCMockstub<code>[ init]</code> 以返回模拟实例?</p></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>您不能模拟 <code>init</code>,因为它是由模拟对象本身实现的。模拟 <code>init</code> 在您链接的答案中起作用的原因是因为它是一个<strong>自定义初始化方法</strong>。如果您不想使用依赖注入(inject),则必须为 <code>DataService</code> 编写一个自定义的 <code>init</code> 方法,您可以模拟该方法。</p>
<p>在您的实现中添加自定义 <code>init</code> 方法:</p>
<pre><code>// DataService.m
...
- (id) initForTest
{
self = ;
if (self) {
// custom initialization here if necessary, otherwise leave blank
}
return self;
}
...
</code></pre>
<p>然后更新<code>MyHandler</code>实现来调用这个<code>initForTest</code>:</p>
<pre><code>@implementation MyHandler
...
-(void) processData {
DataService *service = [ initForTest];
NSDictionary *data = ;
;
}
@end
</code></pre>
<p>最后将您的测试更新为 stub<code>initForTest</code>:</p>
<pre><code>id DataServiceMock = OCMClassMock();
OCMStub().andReturn(DataServiceMock);
OCMStub().andReturn(DataServiceMock);
// run function under test
;
// verify is invoked
OCMVerify();
</code></pre>
<p>随意重命名 <code>initForTest</code>,<strong>只要不叫 <code>init</code></strong>。</p></p>
<p style="font-size: 20px;">关于ios -stub[ init] 不起作用,但接受的答案说它应该起作用,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/37654226/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/37654226/
</a>
</p>
页:
[1]