Skip to main content
Solved

CS Error : NumberingID is null while executing unit test

  • November 27, 2024
  • 9 replies
  • 64 views

Hi, I’m trying to create a unit test for my Extension Library, but getting the error “PX.Data.PXException : CS Error: Numbering ID is null”. Here is the code snippet:

   protected virtual OpportunityMaint PrepareGraph()

   {
       Setup<OpportunityMaint>(
         new CRSetup
         {

             OpportunityNumberingID = "OPPORTUNTY",
             QuoteNumberingID = "CRQUOTE",
             CaseNumberingID = "CASE",
             MassMailNumberingID = "MMAIL",
             CampaignNumberingID = "CAMPAIGN",

         });
       var graph = PXGraph.CreateInstance<OpportunityMaint>();
       return graph;
   }

   [Fact]
   public void CalculateMarkup()
   {

       //arrange
       OpportunityMaint graph = PrepareGraph();

       var graphExt = graph.GetExtension<OpportunityMaint_Extension>();

       CROpportunity item =
           (CROpportunity)graph.Caches[typeof(CROpportunity)].Insert(
               new CROpportunity
               {
                   OpportunityID = "OP000401",
                   Subject = "Test Opportunity",
                   ClassID = "PRODUCT",
                   CuryID = "USD",

               });


       CROpportunityProducts oppLine =
           graph.Caches[typeof(CROpportunityProducts)].
           Insert(
               new CROpportunityProducts
               {
                   InventoryID = 691,
                   SiteID = 1,

               }) as CROpportunityProducts;

       //Act
       graph.Caches[typeof(CROpportunityProducts)].Update(oppLine);

       //Assert
       Assert.Equal(100.0m, graph.Products.Current.GetExtension<CROpportunityProductsExt>().UsrMarkup);


   }

 

Best answer by noorula77

Hi ​@Aishwarya ,
I modified your code please try like this if not work please send me customization and package.

 

 public class OpportunityTest : TestBase
 {
     protected override void RegisterServices(ContainerBuilder builder)
     {
         base.RegisterServices(builder);
         builder.RegisterType<PX.Objects.Unit.CurrencyServiceMock>().As<IPXCurrencyService>();
         builder.RegisterType<PX.Objects.Unit.FinPeriodServiceMock>().As<IFinPeriodRepository>();
     }

     protected virtual void SetupNumbering<Graph>()
         where Graph : PXGraph
     {
         var numberingGraph = PXGraph.CreateInstance<NumberingMaint>();

         var numbering = new Numbering
         {
             NumberingID = "OPPORTUNTY",
             Descr = "Opportunity Numbering",
             NewSymbol = "<NEW>",
             UserNumbering = true,
         };
         numberingGraph.Numbering.Insert(numbering);

         var sequence = new NumberingSequence
         {
             NumberingID = "OPPORTUNTY",
             StartNbr = "000001",
             EndNbr = "999999",
             LastNbr = "000000"
         };
         numberingGraph.Sequence.Insert(sequence);

         numberingGraph.Actions.PressSave();

         Setup<Graph>(numbering, sequence);
     }

     protected void SetupCR<Graph>()
         where Graph : PXGraph
     {
         var setupGraph = PXGraph.CreateInstance<CRSetupMaint>();
         var crSetup = new CRSetup
         {
             OpportunityNumberingID = "OPPORTUNTY",
             QuoteNumberingID = "CRQUOTE",
             CaseNumberingID = "CASE",
             MassMailNumberingID = "MMAIL",
             CampaignNumberingID = "CAMPAIGN"
         };
         setupGraph.Setup.Insert(crSetup);
         setupGraph.Actions.PressSave();

         Setup<Graph>(crSetup);
     }

     protected virtual void SetupOrganizationAndBranch<Graph>()
         where Graph : PXGraph
     {
         var orgGraph = PXGraph.CreateInstance<OrganizationMaint>();
         var org = new Organization
         {
             OrganizationCD = "MockOrganization",
             OrganizationID = -1
         };
         orgGraph.Organization.Insert(org);

         var branch = new Branch
         {
             BranchCD = "MockBranch",
             OrganizationID = -1
         };
         orgGraph.Branch.Insert(branch);
         orgGraph.Actions.PressSave();

         Setup<Graph>(org, branch);
     }

     protected virtual OpportunityMaint PrepareGraph()
     {
         // Order matters - first numbering, then CR setup, then org/branch
         SetupNumbering<OpportunityMaint>();
         SetupCR<OpportunityMaint>();
         SetupOrganizationAndBranch<OpportunityMaint>();

         var graph = PXGraph.CreateInstance<OpportunityMaint>();
         return graph;
     }

     [Fact]
     public void CalculateMarkup()
     {
         //arrange
         var graph = PrepareGraph();
         var graphExt = graph.GetExtension<OpportunityMaint_Extension>();

         CROpportunity item = graph.Opportunity.Insert(
             new CROpportunity
             {
                 Subject = "Test Opportunity",
                 ClassID = "PRODUCT",
                 CuryID = "USD",
             });

         // Insert products
         var oppProduct = graph.Products.Insert(
             new CROpportunityProducts
             {
                 InventoryID = 691,
                 SiteID = 1,
             });

         graph.Actions.PressSave();

         //Assert
         Assert.Equal(100.0m, graph.Products.Current.GetExtension<CROpportunityProductsExt>().UsrMarginPct);
     }
 }

View original
Did this topic help you find an answer to your question?

9 replies

Forum|alt.badge.img+1
  • Jr Varsity I
  • 62 replies
  • November 27, 2024

Hi ​@Aishwarya ,

May be the error you're seeing occurs because the numbering sequences aren't properly set up in your test environment. In Acumatica unit tests, you need to not only set up the numbering IDs but also initialize the actual numbering sequences.


  • Author
  • Freshman I
  • 4 replies
  • December 1, 2024

Hi ​@noorula77 ,

So for every form that uses a numbering sequence we have to implement the initialization of numbering sequence to run unit tests?

Also, could you refer me some examples for this.

Thanks,


Forum|alt.badge.img+1
  • Jr Varsity I
  • 62 replies
  • December 2, 2024

Hi ​@Aishwarya  can you try with below code:
protected virtual OpportunityMaint PrepareGraph()
{
    // First, create and insert the numbering sequence
    Setup<OpportunityMaint>(delegate (OpportunityMaint graph)
    {
        PX.Objects.CS.Numbering numbering = new PX.Objects.CS.Numbering()
        {
            NumberingID = "OPPORTUNTY",
            NewSymbol = "O",
            StartNbr = "000001",
        };
        
        PX.Objects.CS.NumberingSequence sequence = new PX.Objects.CS.NumberingSequence()
        {
            NumberingID = "OPPORTUNTY",
            StartNbr = "000001",
            EndNbr = "999999",
            LastNbr = "000000"
        };
        
        graph.Caches[typeof(PX.Objects.CS.Numbering)].Insert(numbering);
        graph.Caches[typeof(PX.Objects.CS.NumberingSequence)].Insert(sequence);
        
        // Setup CRSetup with the numbering references
        var setup = new CRSetup
        {
            OpportunityNumberingID = "OPPORTUNTY",
            QuoteNumberingID = "CRQUOTE",
            CaseNumberingID = "CASE",
            MassMailNumberingID = "MMAIL",
            CampaignNumberingID = "CAMPAIGN"
        };
        graph.Caches[typeof(CRSetup)].Insert(setup);
    });

    var graph = PXGraph.CreateInstance<OpportunityMaint>();
    return graph;
}

[Fact]
public void CalculateMarkup()
{
    //arrange
    OpportunityMaint graph = PrepareGraph();
    var graphExt = graph.GetExtension<OpportunityMaint_Extension>();

    // Create and insert opportunity
    CROpportunity item = new CROpportunity
    {
        Subject = "Test Opportunity",
        ClassID = "PRODUCT",
        CuryID = "USD",
    };
    
    item = (CROpportunity)graph.Caches[typeof(CROpportunity)].Insert(item);
    
    // Create and insert opportunity product
    CROpportunityProducts oppLine = new CROpportunityProducts
    {
        InventoryID = 691,
        SiteID = 1,
    };
    
    oppLine = graph.Caches[typeof(CROpportunityProducts)].Insert(oppLine) as CROpportunityProducts;

    //Act
    oppLine = graph.Caches[typeof(CROpportunityProducts)].Update(oppLine) as CROpportunityProducts;

    //Assert
    Assert.Equal(100.0m, graph.Products.Current.GetExtension<CROpportunityProductsExt>().UsrMarkup);
}
 

The key changes:

  1. Added proper numbering sequence setup in the PrepareGraph method
  2. Removed the hardcoded OpportunityID since it should be generated by the numbering sequence

  • Author
  • Freshman I
  • 4 replies
  • December 2, 2024

Hi ​@noorula77 ,

I’m not able to add delegate type in place of IBL table, getting below error:

 


Forum|alt.badge.img+1
  • Jr Varsity I
  • 62 replies
  • December 2, 2024

Hi ​@Aishwarya ,

Changed the delegate syntax to use a lambda expression with => instead of the delegate keyword.

 

protected virtual OpportunityMaint PrepareGraph()
{
    Setup<OpportunityMaint>((graphName) =>
    {
        PX.Objects.CS.Numbering numbering = new PX.Objects.CS.Numbering
        {
            NumberingID = "OPPORTUNTY",
            NewSymbol = "O",
            StartNbr = "000001"
        };
        
        PX.Objects.CS.NumberingSequence sequence = new PX.Objects.CS.NumberingSequence
        {
            NumberingID = "OPPORTUNTY",
            StartNbr = "000001",
            EndNbr = "999999",
            LastNbr = "000000"
        };
        
        PXGraph.CreateInstance<PX.Objects.CS.NumberingMaint>()
            .Insert(numbering);
        PXGraph.CreateInstance<PX.Objects.CS.NumberingMaint>()
            .Insert(sequence);
            
        var setup = new CRSetup
        {
            OpportunityNumberingID = "OPPORTUNTY",
            QuoteNumberingID = "CRQUOTE",
            CaseNumberingID = "CASE",
            MassMailNumberingID = "MMAIL",
            CampaignNumberingID = "CAMPAIGN"
        };
        
        return setup;
    });

    var graph = PXGraph.CreateInstance<OpportunityMaint>();
    return graph;
}


  • Author
  • Freshman I
  • 4 replies
  • December 3, 2024

Hi ​@noorula77 ,

Unfortunately even lambda operation is not supported in the Setup class.


Forum|alt.badge.img+1
  • Jr Varsity I
  • 62 replies
  • December 3, 2024

Hi ​@Aishwarya ,

  • Removed the delegate/lambda approach entirely
  • Used the Setup method to directly pass the data objects

protected virtual OpportunityMaint PrepareGraph()
{
    // Setup the CRSetup with just the data
    Setup<OpportunityMaint>(
        new PX.Objects.CS.Numbering
        {
            NumberingID = "OPPORTUNTY",
            NewSymbol = "O",
            StartNbr = "000001"
        },
        new PX.Objects.CS.NumberingSequence
        {
            NumberingID = "OPPORTUNTY",
            StartNbr = "000001",
            EndNbr = "999999",
            LastNbr = "000000"
        },
        new CRSetup
        {
            OpportunityNumberingID = "OPPORTUNTY",
            QuoteNumberingID = "CRQUOTE",
            CaseNumberingID = "CASE",
            MassMailNumberingID = "MMAIL",
            CampaignNumberingID = "CAMPAIGN"
        }
    );

    var graph = PXGraph.CreateInstance<OpportunityMaint>();
    return graph;
}


  • Author
  • Freshman I
  • 4 replies
  • December 4, 2024

Hi ​@noorula77 ,

 

Tired passing objects directly, still getting the same error:

  protected virtual void SetupNumbering<Graph>()
    where Graph : PXGraph
  {
      Setup<Graph>(
          new Numbering
          {
              NumberingID = "OPPORTUNTY",
              Descr = "Opportunity Numbering",
              NewSymbol = "<NEW>",
              UserNumbering = true,
          },
          new NumberingSequence
          {
              NumberingID = "OPPORTUNTY",
              StartNbr = "000001",
              EndNbr = "999999",
              LastNbr = "000000"
          });
  }

  protected void SetupCR<Graph>()
   where Graph : PXGraph
  {
     
      Setup<Graph>(
          new CRSetup
          {
              OpportunityNumberingID = "OPPORTUNTY",
          });
  }

  protected virtual void SetupOrganizationAndBranch<Graph>()
     where Graph : PXGraph
  {
      Setup<Graph>(
          new Organization()
          {
              OrganizationCD = "MockOrganization",
              OrganizationID = -1
          },
          new Branch()
          {
              BranchCD = "MockBranch",
              OrganizationID = -1
          });
  }

  protected virtual OpportunityMaint PrepareGraph()
  {
      SetupCR<OpportunityMaint>();
      SetupNumbering<OpportunityMaint>();
      SetupOrganizationAndBranch<OpportunityMaint>();

      var graph = PXGraph.CreateInstance<OpportunityMaint>();
      return graph;
  }

 

  [Fact]
  public void CalculateMarkup()
  {

      //arrange
      var graph = PrepareGraph();

      var graphExt = graph.GetExtension<OpportunityMaint_Extension>();           

      CROpportunity item =
          graph.Opportunity.Insert(
              new CROpportunity
              {
                  
                  Subject = "Test Opportunity",
                  ClassID = "PRODUCT",
                  CuryID = "USD",
                 

              });

      //Act
      //graph.Caches[typeof(CROpportunityProducts)].Update(oppLine);

      //Assert
      Assert.Equal(100.0m, graph.Products.Current.GetExtension<CROpportunityProductsExt>().UsrMarginPct);


  }

  protected override void RegisterServices(ContainerBuilder builder)
  {
      base.RegisterServices(builder);
      builder.RegisterType<PX.Objects.Unit.CurrencyServiceMock>().As<IPXCurrencyService>();
      builder.RegisterType<PX.Objects.Unit.FinPeriodServiceMock>().As<IFinPeriodRepository>();

  }

 

I even tried inserting into cache like mentioned in https://github.com/Acumatica/UnitTestExamples/blob/master/UnitTestsDemo/Tests/CATransferTest.cs, still no luck.


Forum|alt.badge.img+1
  • Jr Varsity I
  • 62 replies
  • Answer
  • December 4, 2024

Hi ​@Aishwarya ,
I modified your code please try like this if not work please send me customization and package.

 

 public class OpportunityTest : TestBase
 {
     protected override void RegisterServices(ContainerBuilder builder)
     {
         base.RegisterServices(builder);
         builder.RegisterType<PX.Objects.Unit.CurrencyServiceMock>().As<IPXCurrencyService>();
         builder.RegisterType<PX.Objects.Unit.FinPeriodServiceMock>().As<IFinPeriodRepository>();
     }

     protected virtual void SetupNumbering<Graph>()
         where Graph : PXGraph
     {
         var numberingGraph = PXGraph.CreateInstance<NumberingMaint>();

         var numbering = new Numbering
         {
             NumberingID = "OPPORTUNTY",
             Descr = "Opportunity Numbering",
             NewSymbol = "<NEW>",
             UserNumbering = true,
         };
         numberingGraph.Numbering.Insert(numbering);

         var sequence = new NumberingSequence
         {
             NumberingID = "OPPORTUNTY",
             StartNbr = "000001",
             EndNbr = "999999",
             LastNbr = "000000"
         };
         numberingGraph.Sequence.Insert(sequence);

         numberingGraph.Actions.PressSave();

         Setup<Graph>(numbering, sequence);
     }

     protected void SetupCR<Graph>()
         where Graph : PXGraph
     {
         var setupGraph = PXGraph.CreateInstance<CRSetupMaint>();
         var crSetup = new CRSetup
         {
             OpportunityNumberingID = "OPPORTUNTY",
             QuoteNumberingID = "CRQUOTE",
             CaseNumberingID = "CASE",
             MassMailNumberingID = "MMAIL",
             CampaignNumberingID = "CAMPAIGN"
         };
         setupGraph.Setup.Insert(crSetup);
         setupGraph.Actions.PressSave();

         Setup<Graph>(crSetup);
     }

     protected virtual void SetupOrganizationAndBranch<Graph>()
         where Graph : PXGraph
     {
         var orgGraph = PXGraph.CreateInstance<OrganizationMaint>();
         var org = new Organization
         {
             OrganizationCD = "MockOrganization",
             OrganizationID = -1
         };
         orgGraph.Organization.Insert(org);

         var branch = new Branch
         {
             BranchCD = "MockBranch",
             OrganizationID = -1
         };
         orgGraph.Branch.Insert(branch);
         orgGraph.Actions.PressSave();

         Setup<Graph>(org, branch);
     }

     protected virtual OpportunityMaint PrepareGraph()
     {
         // Order matters - first numbering, then CR setup, then org/branch
         SetupNumbering<OpportunityMaint>();
         SetupCR<OpportunityMaint>();
         SetupOrganizationAndBranch<OpportunityMaint>();

         var graph = PXGraph.CreateInstance<OpportunityMaint>();
         return graph;
     }

     [Fact]
     public void CalculateMarkup()
     {
         //arrange
         var graph = PrepareGraph();
         var graphExt = graph.GetExtension<OpportunityMaint_Extension>();

         CROpportunity item = graph.Opportunity.Insert(
             new CROpportunity
             {
                 Subject = "Test Opportunity",
                 ClassID = "PRODUCT",
                 CuryID = "USD",
             });

         // Insert products
         var oppProduct = graph.Products.Insert(
             new CROpportunityProducts
             {
                 InventoryID = 691,
                 SiteID = 1,
             });

         graph.Actions.PressSave();

         //Assert
         Assert.Equal(100.0m, graph.Products.Current.GetExtension<CROpportunityProductsExt>().UsrMarginPct);
     }
 }


Reply


Cookie policy

We use cookies to enhance and personalize your experience. If you accept you agree to our full cookie policy. Learn more about our cookies.

 
Cookie settings