2010-12-07 3 views
3

Я написал код на salesforce, и для того, чтобы выпустить модульные тесты, необходимо покрыть не менее 75%.Как работать в тестовом режиме в salesforce?

Что я столкнулся в том, что classOne, который вызывает методы из classTwo также для покрытия модульного тестирования classTwo «s в classOne, даже если это делается в classTwo файл уже.

Файл MyClassTwo

public with sharing class ClassTwo { 

    public String method1() { 
     return 'one'; 
    } 

    public String method2() { 
     return 'two'; 
    } 

    public static testMethod void testMethod1() { 

     ClassTwo two = new ClassTwo(); 
     String out = two.method1(); 
     system.assertEquals(out, 'one'); //valid  
    } 

    public static testMethod void testMethod2() { 
     ClassTwo two = new ClassTwo(); 
     String out = two.method2(); 
     system.assertEquals(out, 'two'); // valid 
    } 

} 

MyClassOne Файл

public with sharing class ClassOne { 

    public String callClassTwo() { 
     ClassTwo foo = new ClassTwo(); 
     String something = foo.method1(); 

     return something; 
    } 

    public static testMethod void testCallClassTwo() { 
     ClassOne one = new ClassOne(); 
     String out = one.callClassTwo(); 

     system.assertEquals(out, 'one'); 
    } 
} 

Результат тестирования MyClassOne не вернется тестовое покрытие 100%, потому что он говорит, что я не покрыли MyClassTwo method2() часть внутри файла MyClassOne.

Но я уже написал модульный тест для MyClassTwo внутри файла MyClassTwo, как вы можете видеть.

Это значит, что мне нужно скопировать и вставить модульный тест в файл MyClassTwo в MyClassOne?

Выполнение этого дает мне 100% -ное покрытие, но это кажется действительно раздражающим и смешным. Имея такой же тест в ClassA и ClassB ....? Я поступаю неправильно или это так?

Сказав, можно создать mock-объект в salesforce? Я не понять, как же ..

http://sites.force.com/answers/ideaView?c=09a30000000D9xt&id=087300000007m3fAAA&returnUrl=/apex/ideaList%3Fc%3D09a30000000D9xt%26category%3DApex%2B%2526%2BVisualforce%26p%3D19%26sort%3Dpopular

UDPATE

I переписали код и обновляется выше, на этот раз наверняка тест classOne не вернется 100%, даже если ему не вызывает classTwo method2()

ответ

3

Комментарии о Java макет библиотеки не являются очень полезными в Salesforce мире;) В моих проектах, которые мы обычно направлены для создания наших собственных тестовые данные в методе тестирования, вызывая реальную функциональность, проверяя результаты ... и вся тестовая среда на стороне Salesforce отвечает за откат транзакции (поэтому в конечном итоге никакие тестовые данные не сохраняются в БД независимо от того, прошел тест или не прошел тест).

Во всяком случае ...

Масато, ваши классы не компилировать (методы вне класса сферы, public String hello() без каких-либо строк вернулся) ... После того, как я установил его, я просто щелкнуть правой кнопкой мыши на MyClassA -> Force.com -> Выполнить испытания и получил полное покрытие кода без каких-либо проблем, так что ваш вопрос должен лежать где-нибудь еще ...

Вот как это выглядит: http://dl.dropbox.com/u/709568/stackoverflow/masato_code_coverage.png

Я пытаюсь думать, что, возможно, пошло не так ... вы уверены, что все классы скомпилированы и сохранены на стороне сервера? Вы помещали методы тестирования в те же классы, что и функциональные, или в отдельные (обычно я делаю отдельное имя класса с похожим именем, например MyClassATest). Если это отдельный класс - на каком файле вы нажали «запустить тесты»? И последнее, но не менее важное: если вы сталкиваетесь с этой проблемой во время развертывания из песочницы для производства, убедитесь, что вы выбрали все классы, которые вам нужны в мастере развертывания?

1

Если вы действительно хотите выполнить «единичный» тест, вы должны проверить поведение своего класса B и поведение вашего класса A, издеваясь над вызовом метода класса B.

Это трудный разговор между фальшивыми любовниками и другими (Мартин Фаулер, я думаю, не «издевательство»).

В любом случае. Вы должны перестать думать о 100% -ном охвате. Вы должны думать о:

  • Почему я тестирую?

  • Как я тестирую?

Здесь, я бы определенно пойти на 2 тестов:

  • Один тест для класса B в файл тестового класса б, чтобы быть уверенным, метод B хорошо реализован, со всеми побочные эффекты, побочные эффекты и т. д.

  • один тест для класса А насмешливый класса B

Что такое макет?

Остановить ОЧЕНЬ прост: макет - это часть кода в вашем тесте, которая будет говорить: когда вызывается метод класса B, всегда возвращайте это значение: «+++».

Делая это, вы позволяете себе иметь настраиваемый и модульный набор тестов.

В Java, я люблю Mockito: http://mockito.org/

Хотя один из моих коллег являются ведущим сопровождающим EasyMock: http://easymock.org/

Надеется, что это помогает. Спросите меня, нужна ли вам дополнительная помощь.

EDIT НЕКОТОРЫХ Пример

С Java и Mockito:

public class aUTest { 

    protected A a; 

    @Mock protected B b; 

    @Before 
    public void setUp(){ 
     MockitoAnnotations.initMocks(this); 
     a = new A(); 
     ReflectionTestUtils.setField(a, "b", b); 
    } 

     @Test 
    public void test_A_method_should_not_throw_exception() 
      when(b. execute()).thenReturn(true); //just an example of a return value from b. execute() 
      Boolean result = a.testHello(); 

     // Assert 
     Assert.assertEquals(true, result); 
    } 
+0

Я просмотрел насмешливым учебник, но, кажется, трудно в вершине. Не могли бы вы привести простой пример того, как в Apex? Его наследование немного больно – 2010-12-07 01:07:26

+0

Я попытался дать вам простой пример. – Pasta 2010-12-07 10:01:30

1

Я создал класс Apex под названием TestHelper для всех моих макетных объектов. Я использую константы (статические окончательные) для значений, которые мне могут понадобиться в другом месте и публичных статических полей для объектов. Отлично работает, и поскольку методы не используются, не требуется никакого покрытия для тестирования.

public without sharing class TestHelper { 
public static final string testPRODUCTNAME = 'test Product Name'; 
public static final string testCOMPANYID = '2508'; 

public static Account testAccount { 
    get{ 
     Account tAccount = new Account(
      Name = 'Test Account', 
      BillingStreet = '123 Main St', 
      BillingCity = 'Dallas', 
      BillingState = 'TX', 
      BillingPostalCode = '75234', 
      Website = 'http://www.google.com', 
      Phone = '222 345 4567',     
      Subscription_Start_Date__c = system.today(), 
      Subscription_End_Date__c = system.today().addDays(30), 
      Number_Of_Seats__c = 1, 
      companyId__c = testCOMPANYID, 
      ZProduct_Name__c = testPRODUCTNAME);  
     insert tAccount; 
     return tAccount; 
    } 
} 

}

Смежные вопросы