{"id":258109,"date":"2015-05-27T20:36:02","date_gmt":"2015-05-27T16:36:02","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=258109"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=258109","title":{"rendered":"\u0414\u0430 \u043d\u0430\u0447\u043d\u0435\u0442\u0441\u044f unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 (Objective-C)"},"content":{"rendered":"<p>             \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Objective-C \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Xcode 6. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/ocmock.org\">OCMock<\/a>. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043d\u0430\u0439\u0434\u0443\u0442 \u0437\u0434\u0435\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0442\u0435\u043c \u0436\u0435, \u043a\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u0441\u0442\u0430\u043b \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u2014 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e unit-\u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Objective-C.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f <a href=\"http:\/\/www.e-uni.ee\/e-kursused\/eucip\/arendus_vk\/143__.html\">\u0441\u044e\u0434\u0430<\/a>.<br \/>  \u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u044b unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/habrahabr.ru\/post\/169381\/\">\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Objective-C.<br \/>  <a name=\"habracut\"><\/a>  <\/p>\n<h2>\u0428\u0430\u0433 1. \u041e\u0441\u043d\u043e\u0432\u044b<\/h2>\n<p>  \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043d\u043e\u0432\u044b\u0439 iOS \u043f\u0440\u043e\u0435\u043a\u0442.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u043a\u0440\u0438\u043d\u0448\u043e\u0442\u044b<\/b><\/p>\n<div class=\"spoiler_text\"><img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/30a\/917\/079\/30a91707900c4725912d9d8075339b19.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/63d\/bfa\/a94\/63dbfaa9420a49dabacd9c04b26624d1.png\"\/><br \/>  <img decoding=\"async\" src=\"https:\/\/habrastorage.org\/files\/8c8\/fa6\/9dc\/8c8fa69dcc05413b89685602b59f8abb.png\"\/>  <\/div>\n<\/div>\n<p>  Xcode, \u043a\u0430\u043a \u043c\u044b \u0432\u0438\u0434\u0438\u043c, \u0441\u0430\u043c \u0441\u043e\u0437\u0434\u0430\u043b \u0434\u043b\u044f \u043d\u0430\u0441 \u043a\u0430\u0442\u0430\u043b\u043e\u0433 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u043e\u0432 DemoUnitTestingTests \u0438 \u0444\u0430\u0439\u043b DemoUnitTestingTests.m. \u0427\u0442\u043e \u043c\u044b \u0442\u0443\u0442 \u0432\u0438\u0434\u0438\u043c:<\/p>\n<p>  \u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0443\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f:<\/p>\n<pre><code class=\"objectivec\">#import &lt;XCTest\/XCTest.h&gt; <\/code><\/pre>\n<p>  \u0422\u043e, \u0447\u0442\u043e \u043d\u0430\u0448 \u043a\u043b\u0430\u0441\u0441 DemoUnitTestingTests \u043d\u0430\u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0441\u044f \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 XCTestCase (\u043d\u0435 \u0431\u0443\u0434\u0435\u043c \u0432\u0434\u0430\u0432\u0430\u0442\u044c\u0441\u044f \u0432 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438).<\/p>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u0435\u0440\u0435\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u043e\u043c \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430:<\/p>\n<pre><code class=\"objectivec\">- (void)setUp {     [super setUp];     \/\/ Put setup code here. This method is called before the invocation of each test method in the class. } <\/code><\/pre>\n<p>  \u041c\u0435\u0442\u043e\u0434 \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u043c\u044b\u0439 \u043f\u043e\u0441\u043b\u0435 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442\u0430 \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u0430:<\/p>\n<pre><code class=\"objectivec\">- (void)tearDown {     \/\/ Put teardown code here. This method is called after the invocation of each test method in the class.     [super tearDown]; } <\/code><\/pre>\n<p>  \u0418 \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e 2 \u0442\u0435\u0441\u0442\u0430. \u041f\u0435\u0440\u0432\u044b\u0439 \u2014 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u044b\u0439 \u0442\u0435\u0441\u0442, \u0432\u0442\u043e\u0440\u043e\u0439 \u2014 \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u0442\u0435\u0441\u0442\u0430 \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438:<\/p>\n<pre><code class=\"objectivec\">- (void)testExample {     \/\/ This is an example of a functional test case.     XCTAssert(YES, @&quot;Pass&quot;); }  - (void)testPerformanceExample {     \/\/ This is an example of a performance test case.     [self measureBlock:^{         \/\/ Put the code you want to measure the time of here.     }]; } <\/code><\/pre>\n<p>  \u041a\u0430\u043a \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c, \u0432\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u0441\u043e \u0441\u043b\u043e\u0432\u0430 test \u0438 \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u0432\u043a\u043b\u044e\u0447\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/p>\n<h2>\u0428\u0430\u0433 2. \u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f<\/h2>\n<p>  \u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0437\u0430\u043c\u0435\u0447\u0430\u043d\u0438\u0439:  <\/p>\n<blockquote><p><u>\u0412\u0441\u0435 \u0442\u0435\u0441\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u0434\u0440\u0443\u0433 \u043e\u0442 \u0434\u0440\u0443\u0433\u0430<\/u><br \/>  <u>\u0414\u0435\u043b\u0430\u0439\u0442\u0435 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u043a\u043b\u0430\u0441\u0441\u0430<\/u><br \/>  <u>\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u0430 \u0434\u043e\u043b\u0436\u043d\u043e \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0442\u044c \u0435\u0433\u043e \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435<\/u><br \/>  <u>\u0420\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u0440\u0430\u0431\u043e\u0442\u044b \u0442\u0435\u0441\u0442\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u0435\u043d \u0432\u043b\u0438\u044f\u0442\u044c \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434<\/u>  <\/p><\/blockquote>\n<p>  <b>\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430<\/b>, \u043d\u0435 \u0441\u0442\u043e\u0438\u0442 \u0434\u0443\u043c\u0430\u0442\u044c, \u0447\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 \u0438\u0437\u0431\u0430\u0432\u0438\u0442 \u0432\u0430\u0448 \u043a\u043e\u0434 \u043e\u0442 \u0431\u0430\u0433\u043e\u0432 \u0440\u0430\u0437 \u0438 \u043d\u0430\u0432\u0441\u0435\u0433\u0434\u0430. \u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u0430\u0448 \u0442\u0435\u0441\u0442 \u043d\u0430\u043f\u0438\u0441\u0430\u043d \u043d\u0435 \u0432\u043f\u043e\u043b\u043d\u0435 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e.<\/p>\n<h2>\u0428\u0430\u0433 3. \u041f\u0440\u0438\u0441\u0442\u0443\u043f\u0430\u0435\u043c \u043a \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044e \u0442\u0435\u0441\u0442\u043e\u0432<\/h2>\n<p>  \u0412\u044b\u0434\u0435\u043b\u0438\u043c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f XCTest, \u0430 \u0442\u0430\u043a \u0436\u0435 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u0442\u0435\u0441\u0442\u044b, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0438\u0445.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u0441\u0435\u0433\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testAlwaysFailed {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0442\u0435\u043a\u0441\u0442 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     XCTFail(@&quot;always failed&quot;); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsEqualPrimitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int primitive1 = 5;     int primitive2 = 5;     XCTAssertEqual(primitive1, primitive2, @&quot;(%d) equal to (%d)&quot;, primitive1, primitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsNotEqualPrimitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int primitive1 = 5;     int primitive2 = 6;     XCTAssertNotEqual(primitive1, primitive2, @&quot;(%d) not equal to (%d)&quot;, primitive1, primitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0441 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsEqualWithAccuracyPrimitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0432\u0435\u043b\u0435\u0447\u0438\u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04424 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     float primitive1 = 5.012f;     float primitive2 = 5.014f;     float accuracy = 0.005;     XCTAssertEqualWithAccuracy(primitive1, primitive2, accuracy, @&quot;(%f) equal to (%f) with accuracy %f&quot;, primitive1, primitive2, accuracy); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u0441 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u044c\u044e \u0431\u0430\u0437\u043e\u0432\u044b\u0445 \u0442\u0438\u043f\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsNotEqualWithAccuracyPrimitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0432\u0435\u043b\u0435\u0447\u0438\u043d\u0430 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u043e\u0439 \u043f\u043e\u0433\u0440\u0435\u0448\u043d\u043e\u0441\u0442\u0438      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04424 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0434\u043b\u044f \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     float primitive1 = 5.012f;     float primitive2 = 5.014f;     float accuracy = 0.001;     XCTAssertNotEqualWithAccuracy(primitive1, primitive2, accuracy, @&quot;(%f) not equal to (%f) with accuracy %f&quot;, primitive1, primitive2, accuracy); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 BOOL YES<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsTrue {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - boolean \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     BOOL isTrue = YES;     XCTAssertTrue(isTrue); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 BOOL NO<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsFalse {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - boolean \u043b\u0438\u0431\u043e \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u043d\u0438\u0435      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     BOOL isTrue = NO;     XCTAssertFalse(isTrue); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 nil<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsNil {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     id foo = nil;     XCTAssertNil(foo, @&quot;pointer:%p&quot;, foo); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u041d\u0415 nil<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testIsNotNil {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     id foo = @&quot;&quot;;     XCTAssertNotNil(foo); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 (&gt;)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testGreaterPrivitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int privitive1 = 4;     int privitive2 = 3;     XCTAssertGreaterThan(privitive1, privitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u043d\u0430 \u0431\u043e\u043b\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e (&gt;=)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testGreaterOrEqualPrivitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int privitive1 = 4;     int privitive2 = 4;     XCTAssertGreaterThanOrEqual(privitive1, privitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 (&lt;)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testLessPrivitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int privitive1 = 3;     int privitive2 = 4;     XCTAssertLessThan(privitive1, privitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0421\u0440\u0430\u0432\u043d\u0435\u043d\u0438\u0435 \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u0432\u043e\u0432 \u043d\u0430 \u043c\u0435\u043d\u044c\u0448\u0435 \u0438\u043b\u0438 \u0440\u0430\u0432\u043d\u043e (&lt;=)<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testLessOrEqualPrivitive {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04321      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043f\u0440\u0438\u043c\u0438\u0442\u0438\u04322      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     int privitive1 = 4;     int privitive2 = 4;     XCTAssertLessThanOrEqual(privitive1, privitive2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testThrowException {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     void (^block)() = ^{         @throw [NSException exceptionWithName:NSGenericException                                        reason:@&quot;test throw&quot;                                      userInfo:nil];     };     XCTAssertThrows(block()); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u041d\u0415 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testNoThrowException {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     void (^block)() = ^{     };     XCTAssertNoThrow(block()); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043b\u0430\u0441\u0441 MyException \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442 NSException  <\/p>\n<pre><code class=\"objectivec\">@interface MyException : NSException @end  @implementation MyException @end <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"objectivec\">- (void)testThrowExceptionClass {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     void (^block)() = ^{         @throw [MyException exceptionWithName:NSGenericException                                        reason:@&quot;test throw&quot;                                      userInfo:nil];     };     XCTAssertThrowsSpecific(block(), MyException); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u041e\u0422\u041b\u0418\u0427\u041d\u042b\u041c \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043b\u0430\u0441\u0441 MyException \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442 NSException  <\/p>\n<pre><code class=\"objectivec\">@interface MyException : NSException @end  @implementation MyException @end <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"objectivec\">- (void)testNoThrowExceptionClass {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     void (^block)() = ^{         @throw [NSException exceptionWithName:NSGenericException                                        reason:@&quot;test throw&quot;                                      userInfo:nil];     };     XCTAssertNoThrowSpecific(block(), MyException); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043a\u043b\u0430\u0441\u0441\u043e\u043c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043b\u0430\u0441\u0441 MyException \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442 NSException  <\/p>\n<pre><code class=\"objectivec\">@interface MyException : NSException @end  @implementation MyException @end <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"objectivec\">- (void)testThrowWithNamedExceptionClass {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0438\u043c\u044f \u043e\u0448\u0438\u0431\u043a\u0438      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04424 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     NSString *nameException = @&quot;name expection&quot;;     void (^block)() = ^{         @throw [MyException exceptionWithName:nameException                                        reason:@&quot;test throw&quot;                                      userInfo:nil];     };     XCTAssertThrowsSpecificNamed(block(), MyException, nameException); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u043d\u0430 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043d\u0438\u0435 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u041e\u0422\u041b\u0418\u0427\u041d\u042b\u041c \u043e\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u0441 \u0438\u043c\u0435\u043d\u0435\u043c<\/b><\/p>\n<div class=\"spoiler_text\">\u041a\u043b\u0430\u0441\u0441 MyException \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u043d\u044b\u0439 \u043e\u0442 NSException  <\/p>\n<pre><code class=\"objectivec\">@interface MyException : NSException @end  @implementation MyException @end <\/code><\/pre>\n<p>  <\/p>\n<pre><code class=\"objectivec\">- (void)testNoThrowWithNamedExceptionClass {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u0431\u043b\u043e\u043a\/\u043c\u0435\u0442\u043e\u0434\/\u0444\u0443\u043d\u043a\u0446\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043a\u043b\u0430\u0441\u0441 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0438\u043c\u044f \u043e\u0448\u0438\u0431\u043a\u0438      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04424 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     NSString *nameException = @&quot;name expection&quot;;     void (^block)() = ^{         @throw [MyException exceptionWithName:[nameException stringByAppendingString:@&quot;123&quot;]                                        reason:@&quot;test throw&quot;                                      userInfo:nil];     };     XCTAssertNoThrowSpecificNamed(block(), MyException, nameException); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0420\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testEqualObject {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 isEqual      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 isEqual      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     id obj1 = @[];     id obj2 = @[];     XCTAssertEqualObjects(obj1, obj2, @&quot;obj1(%@) not equal to obj2(%@))&quot;, obj1, obj2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u0435\u0440\u0430\u0432\u0435\u043d\u0441\u0442\u0432\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u043e\u0432<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testNoEqualObject {     \/*      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04421 - \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 isEqual      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04422 - \u043e\u0431\u044a\u0435\u043a\u0442 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0439 isEqual      \u043d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e      \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u04423 - \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430      \u043f\u043e\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 - \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u0432 \u0444\u043e\u0440\u043c\u0430\u0442 \u0432\u044b\u0432\u043e\u0434\u0430 \u043e\u0448\u0438\u0431\u043a\u0438      *\/     id obj1 = @&quot;name&quot;;     id obj2 = @{};     XCTAssertNotEqualObjects(obj1, obj2, @&quot;obj1(%@) not equal to obj2(%@))&quot;, obj1, obj2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439 \u043f\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testAsync {     \/*      1. \u0421\u043e\u0437\u0434\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435\u043c (\u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043a\u0430\u0437\u0430\u043d\u043e \u0432 \u0441\u043b\u0443\u0447\u0430\u0435 \u043f\u0440\u043e\u0432\u0430\u043b\u0430 \u0442\u0435\u0441\u0442\u0430)      2. \u0412\u044b\u043f\u043e\u043b\u043d\u044f\u0435\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f      3. \u0423\u0441\u0442\u0430\u043d\u0430\u0432\u043b\u0438\u0432\u0430\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435      4. \u0412\u044b\u0437\u044b\u0432\u0430\u0435\u043c fulfill \u043c\u0435\u0442\u043e\u0434 \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u043a\u043b\u0430\u0441\u0441\u0430 XCTestExpectation      \u0415\u0441\u043b\u0438 \u0441\u043f\u0435\u0440\u0432\u0430 \u0432\u044b\u0437\u0432\u0430\u0442\u044c fulfill \u0438 \u043f\u043e\u0442\u043e\u043c \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 - \u0442\u0435\u0441\u0442 \u0431\u0443\u0434\u0435\u0442 \u0441\u0447\u0438\u0442\u0430\u0442\u044c\u0441\u044f \u043f\u0440\u043e\u0439\u0434\u0435\u043d\u043d\u044b\u043c      *\/     XCTestExpectation *expectation = [self expectationWithDescription:@&quot;block not call&quot;];     NSTimeInterval timeout = 1.0f;     [expectation performSelector:@selector(fulfill)                       withObject:nil                       afterDelay:0.3f];     [self waitForExpectationsWithTimeout:timeout                                  handler:nil]; } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<h2>\u0428\u0430\u0433 4. \u0422\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u043a\u043e\u0434\u0430 \u0441 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044f\u043c\u0438<\/h2>\n<p>  \u041f\u043e\u0434\u043e\u0448\u043b\u0438 \u043a \u0441\u0430\u043c\u043e\u0439 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0441\u0442\u0430\u0442\u044c\u0438. \u0415\u0441\u043b\u0438 \u0432\u044b \u0432\u043d\u0438\u043c\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u043b\u0438 2 \u043f\u0435\u0440\u0432\u044b\u0435 \u0441\u0441\u044b\u043b\u043a\u0438, \u0442\u043e \u0443\u0436\u0435 \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e \u0434\u043b\u044f unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u0430\u0441\u0441 \u043e\u0442 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0435\u0439. \u041c\u043e\u0436\u043d\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u0432\u0441\u0435 \u0440\u0443\u043a\u0430\u043c\u0438, \u043d\u043e \u043c\u044b \u0432\u043e\u0437\u044c\u043c\u0435\u043c \u0433\u043e\u0442\u043e\u0432\u043e\u0435. \u0412\u043e\u0437\u044c\u043c\u0435\u043c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OCMock.<\/p>\n<p>  \u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043c, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f <a href=\"https:\/\/cocoapods.org\">CocoaPods<\/a>:  <\/p>\n<blockquote><p>pod &#8216;OCMock&#8217;, &#8216;~&gt; 3.1.2&#8217;<\/p><\/blockquote>\n<p>  \u0420\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0441\u0430\u043c\u044b\u0435 \u0447\u0430\u0441\u0442\u044b\u0435 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u044b \u043f\u0440\u0438 \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u0438 \u0442\u0435\u0441\u0442\u043e\u0432, \u043a\u043e\u0433\u0434\u0430 \u0435\u0441\u0442\u044c \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438, \u0438 \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u043a\u0430\u043a \u0441 \u043d\u0438\u043c\u0438 \u0441\u043f\u0440\u0430\u0432\u0438\u0442\u044c\u0441\u044f, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443 OCMock. \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0434\u043b\u044f \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u0438 \u043a\u043b\u0430\u0441\u0441\u044b ClassA \u0438 ClassB.<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u044c \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0441\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testInit {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0434\u0438\u043c \u0435\u0433\u043e \u0432 init \u043a\u043b\u0430\u0441\u0441\u0430 ClassA      \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c, \u0447\u0442\u043e classA.classB \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043d\u0430 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0434\u0440\u0435\u0441, \u0447\u0442\u043e \u0438 mockClassB      *\/     id mockClassB = OCMClassMock([ClassB class]);     ClassA *classA = [[ClassA alloc] initWithClassB:mockClassB];     XCTAssertEqual(classA.classB, mockClassB); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testStub {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c stub \u043c\u0435\u0442\u043e\u0434, \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0449\u0438\u0439 \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435.      \u041d\u0430\u0441\u0442\u043e\u044f\u0449\u0438\u0439 \u0436\u0435 \u043c\u0435\u0442\u043e\u0434 \u0432 \u043a\u043b\u0430\u0441\u0441\u0435 ClassB \u0431\u0443\u0434\u0435\u0442 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0442\u044c \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435      *\/     NSString *expectedInfo = @&quot;info&quot;;     id mockClassB = OCMClassMock([ClassB class]);     OCMStub([mockClassB info]).andReturn(expectedInfo);      NSString *info = [mockClassB info];     XCTAssertEqualObjects(info, expectedInfo); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0414\u0430\u043d\u043d\u044b\u0435 \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testStubWithArg {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c stub \u043c\u0435\u0442\u043e\u0434, \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u044b\u0439 \u043e\u0442 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445      \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u043c\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f      *\/     id mockClassB = OCMClassMock([ClassB class]);     NSInteger expectedFactorial3 = 6;     NSInteger expectedFactorial5 = 120;     OCMExpect([mockClassB factorial:3]).andReturn(expectedFactorial3);     OCMExpect([mockClassB factorial:5]).andReturn(expectedFactorial5);          NSInteger factorial3 = [mockClassB factorial:3];     NSInteger factorial5 = [mockClassB factorial:5];          XCTAssertEqual(factorial3, expectedFactorial3);     XCTAssertEqual(factorial5, expectedFactorial5); } <\/code><\/pre>\n<\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u041d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044f \u043e\u0442 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testNotification {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c stub \u043c\u0435\u0442\u043e\u0434, \u043f\u043e\u0441\u044b\u043b\u0430\u044e\u0449\u0438\u0439 \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u044e      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock observer \u0434\u043b\u044f \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0441\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u043d\u0438\u044f \u043d\u043e\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438 \u043e\u0442 mock \u043e\u0431\u044a\u0435\u043a\u0442\u0430      \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043b\u0438 \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f mock observer      *\/     id mockClassB = OCMClassMock([ClassB class]);     NSString *notificationName = @&quot;notification name&quot;;     NSNotification *notification = [NSNotification notificationWithName:notificationName                                                                  object:mockClassB];     OCMStub([mockClassB postNotification]).andPost(notification);          id mockObserver = OCMObserverMock();     [[NSNotificationCenter defaultCenter] addMockObserver:mockObserver                                                      name:notificationName                                                    object:mockClassB];     OCMExpect([mockObserver notificationWithName:notificationName                                           object:mockClassB]);          [mockClassB postNotification];     OCMVerifyAll(mockObserver); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0437\u043e\u0432 \u043c\u0435\u0442\u043e\u0434\u0430 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\u041d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u0435\u0442\u0441\u044f \u043f\u043e \u043b\u043e\u0433\u0438\u043a\u0435 \u043e\u0442 \u043f\u0440\u0438\u043c\u0435\u0440\u0430 \u0432\u044b\u0448\u0435. \u041f\u0438\u0448\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0431\u044b\u043b\u0438 \u043b\u0438 \u043e\u043d\u0438 \u0432\u044b\u0437\u0432\u0430\u043d\u044b  <\/p>\n<pre><code class=\"objectivec\">- (void)testVerifyExpect {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0432\u044b\u0437\u043e\u0432\u0430 \u043c\u0435\u0442\u043e\u0434\u043e\u0432 info \u0438 postNotification      \u041f\u0440\u043e\u0432\u0435\u0440\u0438\u043c \u0441\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0438 \u043b\u0438 \u0432\u0441\u0435 \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u0435 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0434\u043b\u044f mock \u043e\u0431\u044a\u0435\u043a\u0442\u0430      *\/     id mockClassB = OCMClassMock([ClassB class]);     OCMExpect([mockClassB info]);     OCMExpect([mockClassB postNotification]);     [mockClassB info];     [mockClassB postNotification];     OCMVerifyAll(mockClassB); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0417\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testPartialMockObject {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassA, \u0438\u0437\u043c\u0435\u043d\u0438\u043c \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0430 \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u043f\u043e\u043b\u044f count.      \u041f\u043e\u043b\u0435 count \u0431\u0443\u0434\u0435\u0442 readonly      *\/     id classA = [[ClassA alloc] initWithCount:3];     XCTAssertEqual([classA count], 3);          id partialMock = OCMPartialMock(classA);     OCMStub([partialMock count]).andReturn(41);     XCTAssertEqual([classA count], 41); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  <\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0412\u044b\u0437\u043e\u0432 \u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0431\u043b\u043e\u043a\u0430 \u0441 \u0437\u0430\u0434\u0435\u0440\u0436\u043a\u043e\u0439<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">- (void)testStubWithBlock {     \/*      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassB \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c stub \u043c\u0435\u0442\u043e\u0434, \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u044e\u0449\u0438\u0439 \u0431\u043b\u043e\u043a \u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0435\u0433\u043e      \u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c mock \u043e\u0431\u044a\u0435\u043a\u0442 \u043a\u043b\u0430\u0441\u0441\u0430 ClassA \u0438 \u043d\u0430\u043f\u0438\u0448\u0435\u043c \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u0432\u044b\u0437\u043e\u0432\u0430 \u0431\u043b\u043e\u043a\u0430      \u0423\u0431\u0435\u0434\u0438\u043c\u0441\u044f, \u0447\u0442\u043e \u0432\u044b\u0437\u043e\u0432 \u0431\u043b\u043e\u043a\u0430 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u0435\u043b \u0432 \u043d\u0435\u043a\u0438\u0439 \u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439 \u043f\u0440\u043e\u043c\u0435\u0436\u0443\u0442\u043e\u043a \u0432\u0440\u0435\u043c\u0435\u043d\u0438      *\/     void (^block)() = [OCMArg checkWithBlock:^BOOL(id value) {         return YES;     }];     id mockClassB = OCMClassMock([ClassB class]);     OCMExpect([mockClassB setBlock:block]);      id mockClassA = OCMClassMock([ClassA class]);     OCMStub([mockClassA useBlockInClassB]).andDo(^(NSInvocation *invocation) {         dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{             [mockClassB setBlock:^{             }];         });     });      [mockClassA useBlockInClassB];     OCMVerifyAllWithDelay(mockClassB, 2); } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0414\u043b\u044f \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0437\u0430\u0434\u0430\u0447 \u044d\u0442\u043e\u0433\u043e \u0434\u043e\u043b\u0436\u043d\u043e \u0445\u0432\u0430\u0442\u0438\u0442\u044c. \u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u044e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c <a href=\"http:\/\/ocmock.org\/reference\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<h2>\u0428\u0430\u0433 5. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 \u043b\u043e\u0433\u0438\u043a\u0438<\/h2>\n<p>  \u041f\u0440\u0438 \u0437\u0430\u043f\u0443\u0441\u043a\u0435 \u0442\u0435\u0441\u0442\u043e\u0432 (\u043a \u043f\u0440\u0438\u043c\u0435\u0440\u0443 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0435\u0439 cmd+u) \u0441\u043f\u0435\u0440\u0432\u0430 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u043a\u043e\u0434 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u0442\u0435\u0441\u0442\u044b. \u042d\u0442\u043e \u043f\u043b\u043e\u0445\u043e. \u0427\u0430\u0441\u0442\u043e \u0431\u044b\u0432\u0430\u044e\u0442 \u0441\u0438\u0442\u0443\u0430\u0446\u0438\u0438, \u043a\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0438 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0438 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430 \u043f\u0430\u0434\u0430\u0435\u0442 \u0438 \u0442\u0435\u0441\u0442\u044b \u043d\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f. \u0418\u0441\u043f\u0440\u0430\u0432\u0438\u043c \u044d\u0442\u043e.<\/p>\n<p>  <u>\u0421\u043e\u0437\u0434\u0430\u0434\u0438\u043c \u0435\u0449\u0435 \u043e\u0434\u0438\u043d AppDelegate<\/u> (AppDelegateForTest), \u043d\u043e \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0442\u0435\u0441\u0442\u043e\u0432 (\u043f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0432\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 Target).<\/p>\n<div class=\"spoiler\"><b class=\"spoiler_title\">\u0418\u0437\u043c\u0435\u043d\u0438\u043c main.c<\/b><\/p>\n<div class=\"spoiler_text\">\n<pre><code class=\"objectivec\">int main(int argc, char *argv[]) {     @autoreleasepool {         Class appDelegateClass = (NSClassFromString(@&quot;XCTestCase&quot;) ? [TestingSAAppDelegate class] : [SAAppDelegate class]);         return UIApplicationMain(argc, argv, nil, NSStringFromClass(appDelegateClass));     } } <\/code><\/pre>\n<p>  <\/div>\n<\/div>\n<p>  \u0413\u043e\u0442\u043e\u0432\u043e. \u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0430\u0448\u0438 \u0442\u0435\u0441\u0442\u044b \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f \u043d\u0435\u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e \u043e\u0442 \u043d\u0430\u0448\u0435\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u043a\u043e\u0434\u0430.<\/p>\n<p>  \u0414\u0443\u043c\u0430\u044e, \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0442\u0430\u0442\u044c\u044e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u043a\u043e\u043d\u0447\u0438\u0442\u044c. \u0411\u044b\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438\u0437 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0441\u0430\u043c\u043e\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e\u0435 \u0438\u0437 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 OCMock. \u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0430 \u043c\u043e\u0436\u043d\u043e \u0441\u043a\u0430\u0447\u0430\u0442\u044c <a href=\"https:\/\/github.com\/ajjnix\/DemoUnitTesting\">\u0437\u0434\u0435\u0441\u044c<\/a>.<\/p>\n<p>  \u0423\u0434\u0430\u0447\u043d\u043e\u0433\u043e \u0432\u0430\u043c \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f!             <\/p>\n<div class=\"clear\"><\/div>\n<p> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"http:\/\/habrahabr.ru\/post\/258953\/\"> http:\/\/habrahabr.ru\/post\/258953\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>             \u0414\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0430\u0442\u044c\u044f \u043f\u043e\u0441\u0432\u044f\u0449\u0435\u043d\u0430 \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Objective-C \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044f Xcode 6. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u0434\u043b\u044f \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u044f\u044f \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 <a href=\"http:\/\/ocmock.org\">OCMock<\/a>. \u041e\u043f\u044b\u0442\u043d\u044b\u0435 \u0440\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043d\u0435 \u043d\u0430\u0439\u0434\u0443\u0442 \u0437\u0434\u0435\u0441\u044c \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u043f\u043e\u043b\u0435\u0437\u043d\u043e\u0439 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438, \u0442\u0435\u043c \u0436\u0435, \u043a\u0442\u043e \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u0432\u0441\u0442\u0430\u043b \u043d\u0430 \u044d\u0442\u043e\u0442 \u043f\u0443\u0442\u044c \u2014 \u0441\u0442\u0430\u0442\u044c\u044f \u043e\u0442\u043a\u0440\u043e\u0435\u0442 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0437\u043d\u0430\u043d\u0438\u044f \u043f\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u0438\u044e unit-\u0442\u0435\u0441\u0442\u043e\u0432 \u043d\u0430 \u044f\u0437\u044b\u043a\u0435 Objective-C.<\/p>\n<p>  \u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u044b \u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u043e\u0441\u044c\u0431\u0430 \u043e\u0431\u0440\u0430\u0442\u0438\u0442\u044c\u0441\u044f <a href=\"http:\/\/www.e-uni.ee\/e-kursused\/eucip\/arendus_vk\/143__.html\">\u0441\u044e\u0434\u0430<\/a>.<br \/>  \u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u044b unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f <a href=\"http:\/\/habrahabr.ru\/post\/169381\/\">\u0441\u044e\u0434\u0430<\/a>.<\/p>\n<p>  \u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u043c\u044b \u043d\u0430\u0447\u043d\u0435\u043c \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435 unit-\u0442\u0435\u0441\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 Objective-C.  <\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-258109","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258109","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=258109"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/258109\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=258109"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=258109"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=258109"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}