• Salesforce_ModeInGPM_2015.5.28总结


    今日工作任务:

     1. 更新客户代码合并提交到我们代码库
    2. 理解feizhi补上的单元测试代码,针对MnPriceApprovalForm的
    3. 额外有时间学习下单元测试的概念
     
    salesforce中apex代码的测试流程。
    1.定义测试类,注明@isTest注解
    @isTest
    public class MnPriceApprovalFormControllerTest {
    
    }
    

    2.定义测试类中的测试数据类

    @isTest
    public class MnPriceApprovalFormControllerTest {
    
        private static Integer APPROVAL_LEVELS_IN_THIS_TEST = 3;
    
        public class TestData {
    
            public User localUser1, regionUser1, globalUser1, submitterUser1, adminUser1;
            public MnCountry__c country;
            public MnProduct__c family, family2;
            public MnProductSKU__c product1, product2;
            public MnPrice__c productPricing1, productPricing2;
            public MnPriceType__c globalPriceLevel;
            public MnCountryPriceType__c priceLevel;
            public MnCountryProductSKU__c countryProductSKU1, countryProductSKU2;
    
            public TestData() {
                TestDataCreator.createUsers(
                    new List<Map<String, Object>> {
                        new Map<String, Object> {
                            TestDataCreator.USER_USERNAME => 'LocalUser1@testorg.com',
                            TestDataCreator.USER_LOCALE => 'en_US',
                            TestDataCreator.PROFILE_NAME => 'GPM_Standard_User',
                            TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION'
                        },
                        new Map<String, Object> {
                            TestDataCreator.USER_USERNAME => 'RegionUser1@testorg.com',
                            TestDataCreator.USER_LOCALE => 'en_US',
                            TestDataCreator.PROFILE_NAME => 'GPM_Standard_User',
                            TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION'
                        },
                        new Map<String, Object> {
                            TestDataCreator.USER_USERNAME => 'GlobalUser1@testorg.com',
                            TestDataCreator.USER_LOCALE => 'en_US',
                            TestDataCreator.PROFILE_NAME => 'GPM_Standard_User',
                            TestDataCreator.PERMISSION_SET_NAME => 'GPM_ADMIN'
                        },
                        new Map<String, Object> {
                            TestDataCreator.USER_USERNAME => 'SubmitterUser1@testorg.com',
                            TestDataCreator.USER_LOCALE => 'en_US',
                            TestDataCreator.PROFILE_NAME => 'GPM_Standard_User',
                            TestDataCreator.PERMISSION_SET_NAME => 'GPM_FOUNDATION'
                        },
                        new Map<String, Object> {
                            TestDataCreator.USER_USERNAME => 'AdminUser1@testorg.com',
                            TestDataCreator.USER_LOCALE => 'en_US',
                            TestDataCreator.PROFILE_NAME => 'System Administrator',
                            TestDataCreator.PERMISSION_SET_NAME => 'GPM_ADMIN'
                        }
                    }
                );
    
                localUser1 = TestDataCreator.getUser('LocalUser1@testorg.com');
                regionUser1 = TestDataCreator.getUser('RegionUser1@testorg.com');
                globalUser1 = TestDataCreator.getUser('GlobalUser1@testorg.com');
                submitterUser1 = TestDataCreator.getUser('SubmitterUser1@testorg.com');
                adminUser1 = TestDataCreator.getUser('AdminUser1@testorg.com');
    
                // Configure Data
                system.runAs(globalUser1)
                {
                    List<MnPrice__c> prices = TestDataCreator.createPrices(
                        new List<Map<String, Object>> {
                            new Map<String, Object> {
                                TestDataCreator.COUNTRY_NAME => 'TestCountry',
                                TestDataCreator.COUNTRY_ISO_CODE => 'C1',
                                TestDataCreator.CURRENCY_ISO_CODE => 'USD',
                                TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true,
                                TestDataCreator.REGION_NAME => 'TestRegion',
                                TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct1',
                                TestDataCreator.PRODUCT_NAME => 'TestFamily',
                                TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer',
                                TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Approved But Not Marketed',
                                TestDataCreator.PRICE => 10,
                                TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1),
                                TestDataCreator.PRICE_END_DATE => null
                            },
                            new Map<String, Object> {
                                TestDataCreator.COUNTRY_NAME => 'TestCountry',
                                TestDataCreator.COUNTRY_ISO_CODE => 'C1',
                                TestDataCreator.CURRENCY_ISO_CODE => 'USD',
                                TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true,
                                TestDataCreator.REGION_NAME => 'TestRegion',
                                TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct2',
                                TestDataCreator.PRODUCT_NAME => 'TestFamily',
                                TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer',
                                TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Approved But Not Marketed',
                                TestDataCreator.PRICE => 200,
                                TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1),
                                TestDataCreator.PRICE_END_DATE => null
                            },
                            new Map<String, Object> {
                                TestDataCreator.COUNTRY_NAME => 'TestCountry',
                                TestDataCreator.COUNTRY_ISO_CODE => 'C1',
                                TestDataCreator.CURRENCY_ISO_CODE => 'USD',
                                TestDataCreator.COUNTRY_MULTICURRENCY_ENABLED => true,
                                TestDataCreator.REGION_NAME => 'TestRegion',
                                TestDataCreator.PRODUCT_SKU_NAME => 'TestProduct3',
                                TestDataCreator.PRODUCT_NAME => 'TestFamily2',
                                TestDataCreator.PRICE_TYPE_NAME => 'Ex-Manufacturer',
                                TestDataCreator.COUNTRY_PRODUCT_SKU_CURRENT_STATUS => 'Actively Marketed',
                                TestDataCreator.PRICE => 200,
                                TestDataCreator.PRICE_START_DATE => system.today().addMonths(-1),
                                TestDataCreator.PRICE_END_DATE => null
                            }
                        }
                    );
                    country = TestDataCreator.getCountry('TestCountry');
                    family = TestDataCreator.getProduct('TestFamily');
                    family2 = TestDataCreator.getProduct('TestFamily2');
                    priceLevel = TestDataCreator.getCountryPriceType('TestCountry','Ex-Manufacturer');
                    product1 = TestDataCreator.getProductSKU('TestProduct1');
                    product2 = TestDataCreator.getProductSKU('TestProduct2');
                    countryProductSKU1 = TestDataCreator.getCountryProductSKU('TestCountry','TestProduct1');
                    countryProductSKU2 = TestDataCreator.getCountryProductSKU('TestCountry','TestProduct2');
                    productPricing1 = prices[0];
                    productPricing2 = prices[1];
                }
    
                // Configure Data Visibility
                system.runAs(globalUser1)
                {
                    GPUserManager.setAsynchronous(false);
    
                    // local and region users have access to all products
                    MnUserConfig__c submitterUserConfig = new MnUserConfig__c(
                        User__c=submitterUser1.Id,
                        ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS
                    );
                    MnUserConfig__c localUserConfig = new MnUserConfig__c(
                        User__c=localUser1.Id,
                        ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS
                    );
                    MnUserConfig__c regionUserConfig = new MnUserConfig__c(
                        User__c=regionUser1.Id,
                        ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS
                    );
                    MnUserConfig__c globalUserConfig = new MnUserConfig__c(
                        User__c=globalUser1.Id,
                        ProductAccess__c=GPUserManager.PICKLIST_OPTION_ALL_PRODUCTS,
                        RegionAccess__c=GPUserManager.PICKLIST_OPTION_EDIT,
                        PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED
                    );
                    insert new List<MnUserConfig__c>{submitterUserConfig,localUserConfig,regionUserConfig,globalUserConfig};
    
                    // local and submitter users have edit access to country
                    MnUserCountry__c submitterUserCountry = new MnUserCountry__c(
                            MnUserConfig__c=submitterUserConfig.Id,
                            MnCountry__c=country.Id,
                            Access__c=GPUserManager.PICKLIST_OPTION_EDIT,
                            PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED
                    );
                    MnUserCountry__c localUserCountry = new MnUserCountry__c(
                            MnUserConfig__c=localUserConfig.Id,
                            MnCountry__c=country.Id,
                            Access__c=GPUserManager.PICKLIST_OPTION_EDIT,
                            PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED
                    );
                    insert new List<MnUserCountry__c>{submitterUserCountry,localUserCountry};
    
                    // region user has edit access to region
                    MnUserRegion__c regionUserRegion = new MnUserRegion__c(
                        MnUserConfig__c=regionUserConfig.Id,
                        MnRegion__c=TestDataCreator.getRegion('TestRegion').Id,
                        Access__c=GPUserManager.PICKLIST_OPTION_EDIT,
                        PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED
                    );
                    // local user has read access to TestRegion
                    MnUserRegion__c localUserRegion = new MnUserRegion__c(
                            MnUserConfig__c=localUserConfig.Id,
                            MnRegion__c=TestDataCreator.getRegion('TestRegion').Id,
                            Access__c=GPUserManager.PICKLIST_OPTION_READ,
                            PriceAccess__c=GPUserManager.PICKLIST_OPTION_UNPUBLISHED
                    );
                    insert new List<MnUserRegion__c> {regionUserRegion, localUserRegion};
                }
    
                // Configure Approvers
                system.runAs(globalUser1)
                {
                    MnApprover__c approver1 = new MnApprover__c(
                        MnApprover__c=localUser1.Id,
                        MnCountry__c=country.Id,
                        MnProduct__c=family.Id,
                        Level__c=1
                    );
                    MnApprover__c approver2 = new MnApprover__c(
                        MnApprover__c=regionUser1.Id,
                        MnCountry__c=country.Id,
                        MnProduct__c=family.Id,
                        Level__c=2
                    );
                    MnApprover__c approver3 = new MnApprover__c(
                        MnApprover__c=globalUser1.Id,
                        MnCountry__c=country.Id,
                        MnProduct__c=family.Id,
                        Level__c=3
                    );
                    insert new List<MnApprover__c>{approver1,approver2,approver3};
                }
            }
        }
    

      TestDataCreator类是自己创建的类

    public class TestDataCreator {
    
        public static final String PROFILE_NAME = 'profileName';
        public static final String PERMISSION_SET_NAME = 'permissionSetName';
        public static final String USER_ALIAS = 'userAlias';
        public static final String USER_EMAIL = 'userEmail';
        public static final String USER_EMAIL_ENCODING = 'userEmailEncoding';
        public static final String USER_LAST_NAME = 'userLastName';
        public static final String USER_FIRST_NAME = 'userFirstName';
        public static final String USER_USERNAME = 'userUsername';
        public static final String USER_LOCALE = 'userLocale';
    

      system.runAs(globalUser1)方法的作用:Changes the current user to the specified user.

      注:测试数据不会添加到数据库中,因此不会存在存留问题,不需要delete操作。这个测试数据具体是怎么做的有时间可以研究下。

    3.定义测试方法

    static testMethod void testCreateNewPriceApproval()
        {
            TestData td = new TestData();
            MnPriceApprovalPrice__c price = new MnPriceApprovalPrice__c(
                MnCountry__c=td.country.Id,
                MnProduct__c=td.family.Id,
                MnCountryProductSKU__c=td.countryProductSKU1.Id,
                MnCountryPriceType__c=td.priceLevel.Id,
                ProposedPrice__c=9,
                StartDate__c=DateTime.newInstance(Date.today(), Time.newInstance(0, 0, 0, 0)).addDays(2)
            );
            Test.startTest();
            User thisUser = [ select Id from User where Id = :UserInfo.getUserId() ];
            System.runAs ( thisUser ){
                MnCustomSetting__c cs = new MnCustomSetting__c(
                    Name='PriceRequest_SKUTableColumns',
                    Value__c='MnCountryPriceType__c.Published__c,read,MnCountryPriceType__c.Name,read, MnPriceApprovalPrice__c.FinalPercent__c,edit, MnPriceApprovalPrice__c.CurrencyIsoCode,edit');
                insert cs;
            }
            System.runAs(td.submitterUser1) {
                PageReference paPage = Page.PriceApproval;
                paPage.getParameters().put(MnPageParameters.PRODUCT_ID_PARAM, td.family.Id);
                paPage.getParameters().put(MnPageParameters.COUNTRY_ID_PARAM, td.country.Id);
                Test.setCurrentPage(paPage);
    
                MnPriceApproval__c newPriceApproval = new MnPriceApproval__c(
                    MnProduct__c=td.family.Id,
                    MnCountry__c=td.country.Id
                );
    
                // test constructor
                MnPriceApprovalFormController extension = new MnPriceApprovalFormController();
                extension.setPriceApproval(newPriceApproval);
    
                System.assertEquals(true, extension.isExistExtraColumn());
                System.assertEquals(4, extension.getSKUTableCustomCells(td.priceLevel, td.countryProductSKU1, price).size());
                System.assertEquals(td.family.Id,extension.product.Id);
                System.assertEquals(td.country.Id,extension.country.Id);
                System.assertEquals(MnPriceApprovalFormController.SUBMIT_CONFIRMATION_MESSAGE,extension.getSubmitConfirmationMessage());
                System.assertEquals(MnPriceApprovalFormController.DELETE_CONFIRMATION_MESSAGE,extension.getDeleteConfirmationMessage());
                // check prices
                System.assertEquals(2,extension.priceApprovalPrices.size());
                System.assertEquals(2,extension.productSKURows.size());
                MnPriceApprovalFormController.ProductSKURow productSKURow = extension.productSKURows[0];
                System.assertEquals(td.countryProductSKU1.Id,productSKURow.countryProductSKU.Id);
                System.assertEquals(1,productSKURow.priceTypeRows.size());
                MnPriceApprovalFormController.PriceTypeRow priceTypeRow = productSKURow.priceTypeRows[0];
                System.assertEquals(td.productPricing1.Price__c,priceTypeRow.currentPrice.Price__c);
    
                // save
                extension.getPriceApproval().ExpectingResponseDate__c = Date.today().addDays(1);
                priceTypeRow.approvalPrice.ProposedPrice__c = 9;
                priceTypeRow.approvalPrice.StartDate__c = DateTime.newInstance(Date.today(), Time.newInstance(0, 0, 0, 0)).addDays(2);
                extension.onSave();
                MnPriceApproval__c priceApproval = MnPriceApprovalService.getApproval(extension.getPriceApproval().Id);
                System.assertEquals(9,priceApproval.MnPriceApprovalPrices__r[0].ProposedPrice__c);
    
                extension.setPriceApproval(priceApproval);
                System.assertEquals(true,extension.getIsSubmitter());
                System.assertEquals(false,extension.getIsApprover());
                System.assertEquals(true,extension.getSaveButtonRendered());
                System.assertEquals(true,extension.getSubmitButtonRendered());
                System.assertEquals(false,extension.getRecallButtonRendered());
                System.assertEquals(false,extension.getFinalizeButtonRendered());
                System.assertEquals(false,extension.getApproveRejectButtonRendered());
                System.assertEquals(false,extension.getSubmittedDateRendered());
                System.assertEquals(false,extension.getRejectSKURendered());
    
    
                // delete
                extension.onDelete();
                List<MnPriceApproval__c> priceApprovals = [SELECT Id FROM MnPriceApproval__c];
                System.assertEquals(0,priceApprovals.size());
    
                // start over and submit
                newPriceApproval = new MnPriceApproval__c(
                    MnProduct__c=td.family.Id,
                    MnCountry__c=td.country.Id
                );
                extension = new MnPriceApprovalFormController();
                extension.setPriceApproval(newPriceApproval);
                productSKURow = extension.productSKURows[0];
                priceTypeRow = productSKURow.priceTypeRows[0];
                extension.getPriceApproval().PriceChangeType__c='type1';
                extension.getPriceApproval().PriceChangeReason__c='reason1';
                extension.getPriceApproval().PriceChangeFlexibility__c='flex1';
                extension.getPriceApproval().ExpectingResponseDate__c = Date.today().addDays(1);
                productSKURow.countryProductSKU.CurrentStatus__c = 'Actively Marketed';
                priceTypeRow.approvalPrice.ProposedPrice__c = 9;
                priceTypeRow.startDate.ExpectingResponseDate__c = Date.today().addDays(2);
                extension.onSave();
                extension.onSubmit();
                priceApproval = MnPriceApprovalService.getApproval(extension.getPriceApproval().Id);
                System.assertEquals(9,priceApproval.MnPriceApprovalPrices__r[0].ProposedPrice__c);
                System.assertEquals('Actively Marketed',priceApproval.MnPriceApprovalPrices__r[0].CurrentStatus__c);
                System.assertEquals(MnPriceApprovalService.APPROVAL_STATUS_PENDING,priceApproval.ApprovalStatus__c);
    
                // then recall
                // TODO:
    //            PageReference paPage = Page.PriceApproval;
    //            paPage.getParameters().put('Id', priceApproval.Id);
    //            Test.setCurrentPage(paPage);
    //            ApexPages.StandardController controller = new ApexPages.StandardController(new MnPriceApproval__c());
    //            MnPriceApprovalFormController extension = new MnPriceApprovalFormController(controller);
    //            exension.onRecall();
    //            priceApproval = MnPriceApprovalService.getApproval(extension.priceApproval.Id);
    //            System.assertEquals(MnPriceApprovalService.APPROVAL_STATUS_RECALLED,priceApproval.ApprovalStatus__c);
            }
    
            Test.stopTest();
        }
    

      注:Test.startTest(),表示开始测试;Test.stopTest(),表示结束测试。

        System.assertEquals(true, extension.isExistExtraColumn())为断言,这样就相当于测试了类中的方法或变量。

        测试覆盖率需要达到75%。

        每个类都应该拥有相应的测试类。

    测试的难点就在于:测试数据的构造,以及给相应的方法传递怎样的数据。

  • 相关阅读:
    大四实习有点晚[转载]
    .net2.0数据绑定语法
    明天要去南京了
    Master & Content Page Relation(Event Ordering)
    在验证中使用图像和声音(ErrorMessage)
    设置FLash透明
    Basic Skill in .net2.0
    教育研究方法
    程序员是如何捕猎大象的[转]
    My lost card
  • 原文地址:https://www.cnblogs.com/Aaronqcd/p/4535332.html
Copyright © 2020-2023  润新知