0

这是我的工作触发器

trigger CheckChatterPostsOnNSP on FeedItem (before insert) {

Set<Id> nspIds = new Set<Id>();

//Get the NSP that will be updated
List<Non_Standard_Pricing__c> nsp2Update = new List<Non_Standard_Pricing__c>();

//Get the key prefix for the NSP object via a describe call.
String nspKeyPrefix = Non_Standard_Pricing__c.sObjectType.getDescribe().getKeyPrefix();

//Get the Id of the user
Id profileId = UserInfo.getProfileId();

for (FeedItem f: trigger.new) {
    String parentId = f.parentId;

    if(profileId == '00e30000000eWXR') {// Users profile must be Sales and Service
        //We compare the start of the 'parentID' field to the NSP key prefix to
        //restrict the trigger to act on posts made to the NSP object.
        if (
            parentId.startsWith(nspKeyPrefix) &&
            (
                f.Body.contains('***APPROVED BY CHANNEL***') || 
                f.Body.contains('***APPROVED BY CSM***') || 
                f.Body.contains('[APPROVED BY CHANNEL]') || 
                f.Body.contains('[APPROVED BY CSM]')
            )
        ){
            nspIds.add(f.parentId);
        }
    }
}
List < Non_Standard_Pricing__c > nsps = [select id, Pre_Approved_Service_Discount__c, ownerId
from Non_Standard_Pricing__c where id in :nspIds];

for (Non_Standard_Pricing__c n: nsps) {
    //We compare the creator of the Chatter post to the NSP Owner to ensure
    //that only authorized users can close the NSP using the special Chatter 'hot-key'

        n.Pre_Approved_Service_Discount__c = true;
        nsp2Update.add(n);
    }
    update nsp2Update;
}

这是我编写 APEX 测试类的尝试

@isTest
public class CheckChatterPostsOnNSPTEST {

    static testMethod void CheckChatterPostsOnNSPTEST() {
        //Create and insert opp
        Opportunity opp = new Opportunity(Name='test opp', StageName='stage', Probability = 95, CloseDate=system.today());
        insert opp;

        //Create and insert NSP
        Non_Standard_Pricing__c NSP = new Non_Standard_Pricing__c(Opportunity__c = opp.Id, Status__c = 'Open');
        insert NSP;

        //Find user with Profile = Sales and Service
        Profile SalesNService = [Select id from Profile where Name = 'Sales and Service' limit 1];
        User u = new User(
            Alias = 'standt', 
            Email='standarduser@testorg.com',
            EmailEncodingKey='UTF-8',
            LastName='Testing',
            LanguageLocaleKey='en_US',
            LocaleSidKey='en_US',
            ProfileId = SalesNService.Id,
            TimeZoneSidKey='America/Los_Angeles',
            UserName='standarduser@testorg.com'
        );

        System.runAs(u)
        {
            //Create FeedItem entry with text '[APPROVED BY CHANNEL]'
            FeedItem post = new FeedItem();
            post.body = '[APPROVED BY CHANNEL]';

            //Now update the opportunites to invoke the trigger
            Test.startTest();
            insert post;
            Test.stopTest();
        }

        //Assertion Testing
        for(Opportunity o : [select Id, Name, Primary_NSP__r.Pre_Approved_Service_Discount__c from Opportunity where Id = :opp.Id]){
            system.assert(o.Primary_NSP__r.Pre_Approved_Service_Discount__c = true);
        }
    }
}

我收到以下错误消息:System.QueryException:列表没有分配给 SObject 堆栈跟踪的行:Class.CheckChatterPostsOnNSPTEST.CheckChatterPostsOnNSPTEST:第 14 行,第 1 列

任何帮助是极大的赞赏。

4

1 回答 1

1

那将指向这一行:

Profile SalesNService = [Select id from Profile where Name = 'Sales and Service' limit 1];

只需检查此查询是否返回某些内容?个人资料名称中的错字(也许您有下划线或“销售与服务”)?也许 org 中根本没有这样的配置文件(例如,如果您在生产环境中创建了这样的配置文件,但之后您所在的沙箱没有刷新)?

恐怕我们无法为您提供更多帮助;)它甚至与 API 版本、“seeAllData”等无关,因为文档说配置文件仍然可见

于 2012-12-07T20:19:39.747 回答