Вопрос

Я сделал написание кода на Salesforce и для освобождения тестов подразделения должен покрыть хотя бы 75%.

То, что я сталкиваюсь, это то, что classOne которые вызывают методы от classTwo также приходится покрыть classTwoтест на единицу в пределах хотя это делается в 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% покрытие, но это, кажется, действительно раздражает и смешно. Имея тот же тест в CARSA и CLASSB ....? Я делаю не так или так?

Сказав, Можно ли создать объект Mock в Salesforce? Я еще не поступил ..

http://sites.force.com/answers/ideaviews?c=09A30000000D9xt&id=087300000007M3FAAAA &&returnurl=/apex/idealist%3FC%3D09A30000000D9xt%26Category%3DAPEX%2B%2526%2BVisualForce%26P%3D19%26SORT%3DPOPOULE

Удивительный

Я повторюсь написал код и обновленный выше, на этот раз наверняка теста на класс не вернется на 100%, даже если он не звонит ClasStwo Method2 ()

Это было полезно?

Решение

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

Так или иначе...

Masato, ваши классы не компилируют (методы вне сферы класса, public String hello() Без возвращаемой строки) ... После того, как я исправил это, я просто щелкнул щелкнул MyClassa -> force.com -> запустить тесты и получить полный код освещения без каких-либо проблем, чтобы ваша проблема должна лежать где-то еще ...

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

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

Другие советы

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

Это жесткий разговор между любителями издевательствами и другими (Martin Fowler, я думаю, что не является «издевателем»).

Так или иначе. Вы должны перестать думать о 100% покрытии. Вы должны подумать о:

  • Почему я проверяю?

  • Как я проверяю?

Здесь я определенно пошел на 2 теста:

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

  • один тест для издевания класса класса B

Что такое издевательство?

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

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

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

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

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

Редактировать пример

С 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);
    }

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

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; 
    }
}

}

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top