菜鸟教程小白 发表于 2022-12-11 16:39:30

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 &#39;alloc init&#39; 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]
查看完整版本: ios - stub [[SomeClazz alloc] init] 不起作用,但接受的答案说它应该起作用