Friday, February 8, 2013

Examples/ Cheatsheet of several common Unit Test sceneriao with Rhinomocks at JCDC

Examples/ Cheatsheet of several common Unit Test sceneriao with Rhinomocks at JCDC
//This test is to demonstrate "return values" from bll by taking different branches
[Test]
public void BllMethod1_TestFirstBranchByPassingSam()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM(){FirstName = "Sam"};
     Int64 returnValue = 0;
     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod1(criteria)).IgnoreArguments().Return(100);

    
     //*** Act ***    
     returnValue = callPersonBLLHdl.BllMethod1(criteria);

    
     //*** Assert ***     
     Assert.AreEqual(returnValue,1);
}




[Test]
public void BllMethod1_TestSecondBranchByPassingMad()
{

     //*** Arrange***    

     SearchCallPersonVM criteria = new SearchCallPersonVM(){FirstName = "Mad"};
    
     Int64 returnValue = 0;
     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod2(criteria)).IgnoreArguments().Return(100);



     //*** Act ***    
     returnValue = callPersonBLLHdl.BllMethod1(criteria);



     //*** Assert ***     
     Assert.AreEqual(returnValue, 2);
}




[Test]
public void BllMethod1_VerifyDalMethod1IsCalled()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM() { FirstName = "Sam" };

    
     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod1(criteria)).IgnoreArguments().Return(100);

     //*** Act ***    
     callPersonBLLHdl.BllMethod1(criteria);

     //*** Assert ***     
     callPersonDALHdl.AssertWasCalled(x => x.DalMethod1(null),a=>a.IgnoreArguments());
}




[Test]

public void BllMethod1_VerifyDalMethod2IsCalled()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM() { FirstName = "Mad" };
    
     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod2(criteria)).IgnoreArguments().Return(100);

    
     //*** Act ***    
     callPersonBLLHdl.BllMethod1(criteria);


     //*** Assert ***     
     callPersonDALHdl.AssertWasCalled(x => x.DalMethod2(null), a => a.IgnoreArguments());
}





// Demonstrating how to check for expected exceptions
[Test, ExpectedException(typeof(RulesException))]  // Decorate like this to check for a single specific exception
public void BllMethod1_RulesException()
{

      //*** Arrange***         
      SearchCallPersonVM criteria = new SearchCallPersonVM() { FirstName = "" };
      //*** Act ***    
      callPersonBLLHdl.BllMethod1(criteria);
}




//Demonstrating "With what parameters the dal call was made"
[Test]
public void BllMethod1_TestingDalParamtersWereCorrectlyPassedIn()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM() { FirstName = "Sam" };


     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod2(criteria)).IgnoreArguments().Return(100);

    
     //*** Act ***    
     callPersonBLLHdl.BllMethod1(criteria);

     IList<object[]> args = callPersonDALHdl.GetArgumentsForCallsMadeOn(db => db.DalMethod1(Arg<SearchCallPersonVM>.Is.Anything));    


     SearchCallPersonVM finalVal =
          new SearchCallPersonVM();


     if (args != null && args.Count > 0)    
     {
          finalVal = (SearchCallPersonVM)(args[0][0]);
     }

    
     // assert.areequal(obj,obj) is not working well since we did not override the equal method         
     Assert.AreEqual(finalVal.FirstName, "Sam");    
     Assert.AreEqual(finalVal.LastName, "Brown");
}





//Demonstrating "How to check the number of times a method was called"
[Test]
public void BllMethod2_RepeatCalls()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM() { FirstName = "Mad" };


     // Add Stubs for other DAL methods!    
     callPersonDALHdl.Stub(x => x.DalMethod2(criteria)).IgnoreArguments().Return(100);



     //*** Act ***    
     callPersonBLLHdl.BllMethod2(criteria);



     //*** Assert ***     
     callPersonDALHdl.AssertWasCalled(c => c.DalMethod1(null), options => options.IgnoreArguments().Repeat.Times(4));
}




[Test]

public void BllMethod3_MultipleRulesException()
{

     //*** Arrange***    
     SearchCallPersonVM criteria = new SearchCallPersonVM(){FirstName = "John"};
     try    
     {
           //*** Act ***         
           callPersonBLLHdl.BllMethod3(criteria);
     }
     catch(RulesException ex)    
     {

          if (ex.GetType() == typeof(RulesException))         
         {
               ErrorInfo[] errors = ((RulesException)ex).Errors.ToArray();
               Assert.AreEqual(errors[0].ErrorMessage,
"Name cannot be John");    
          }
  }



//Get the arguments that were passed into internal DAL method.
[Test]
public void TestMethod1_criteriaWithPropertyOfCtrIdGreaterThan0()
{

     // Test created by powershell on 02/15/2013 14:32:30//*** Arrange***
     StaffProfilesRptVM TestCriteria = new StaffProfilesRptVM() { CtrId = 15 };




     //*** BLL and DAL Stubs ***
     mockSelfTestDALHdl.Stub(x => x.DDLForStaff(TestCriteria)).IgnoreArguments().Return(new List<DDLDispValueCV>(){});



     //*** Act ***
     selfTestBLLHdl.TestMethod1(TestCriteria);

    
     IList<object[]> args = mockSelfTestDALHdl.GetArgumentsForCallsMadeOn(db => db.DDLForStaff(Arg<StaffProfilesRptVM>.Is.Anything));StaffProfilesRptVM finalVal = new StaffProfilesRptVM();


     if (args != null && args.Count > 0)
     {
          finalVal = (StaffProfilesRptVM)(args[0][0]);
     }



      //*** Assert ***


     Assert.AreEqual(finalVal.CtrId, 22);// Even though i set the ctr_id as 15, it should be called with 22, if i entered this if cluase.
     }


}

Wednesday, January 9, 2013

NHibernate.NonUniqueObjectException inserting a unique class , but it says it's already in the session

Okay,

So I'm inserting new records, Retreived by ADO and inserting with Nhibernate, cause that's how it done here at JCDC. I'm getting NHibernate.NonUniqueObjectException for no discernible reason.





Well, there is a reason. Nhibernate has lots of weird rules about the map it uses to keep track of changes to the state before .commit is called. When you're updating with objects not retrieved by NHibernate, sometimes it gets squirrely. Wish I had better details but there it is, look at the link above and follow the link there to Aiendes explanation for more details (not better really just more).

But here is how I fixed it, I got ahold of the NH session object and merged the object i'm inserting before I inserted it, and voilia, it stopped throwing an exception.





public void InsertDedHist( DedHistCV userInput )
{

 if( IdList.Contains( userInput ) )
 {

     throw new Exception("BUG FOUND!!!!");
 }

 else 
 { 
     IdList.Add( userInput ); 
  }
 

 try 
 { 
     Trace.WriteLine("");
     DedHistEO temp = new DedHistEO();
     temp.InjectFrom( userInput );
     DedHistEO mergedEo = (DedHistEO)JcdcDb.GetSession().Merge( temp );
     DedHistEO userInput2 = JcdcDb.Insert<DedHistEO>( mergedEo );
 }

 catch ( Exception ex )
 {

  throw;
 }
}

Thursday, November 15, 2012

Memory leak in creating RLDC Reports in .Net 4.0

There is a huge memory leak in Microsofts LocalReport implementation in .Net 4.0

The work around to make it a small memory leak is here,
and in the comments is how to make it go away...


Though I'll warn you it's a pain.



http://stackoverflow.com/questions/6220915/very-high-memory-usage-in-net-4-0

Wednesday, November 14, 2012

Are you having a memory leak because of Strucutre map?

So here's the situation....


(My parents went away for a weeks vacation...(Soory, can't help myself, child of the 80s...))



Running a winforms app using a Library that has structure map all through it, and it uses ObjectFactory directly instead of IContainer....


So we get memory leaks that we can't get rid of as Structure map is hanging on to instances of the objects so they can't be garbage collected...



Here's the quick hack to fix in,



Since what I'm doing is in a loop, at the bottom of the loop construct I just type:



// strucutre map memory leak hack, works okay i guess, it's slower as expected - EWB
ObjectFactory.ResetDefaults();



and it flushes all the objects out of Structure map...

Of course it's slower because all the objects get re init-ed in each loop, but the memory
got tons better...

Also note that in an upcoming release,



ObjectFactory.ResetDefaults();



will get changed to



ObjectFactory.Reset();

Tuesday, November 13, 2012

The parameter of type 61 did not have a valid value

The parameter of type 61 did not have a valid value

This is an error from the Sybade Database.

It means that a variable of type 61 (Date) does not have a valid value.

This is ususally caused by your Date time not being Nullable in your EO or you CV and because
Microsoft and Sybase have different Epochs, or Minimum Dates values.

Microsofts EPOCH for a DateTime is: 00:00:00.0000000, January 1, 0001
and Sybases depends on the exat type in your DB see the chart here:
http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.infocenter.dc35400.1550/html/osref/osref281.htm

But in essence here is what happens.

In the DB the Date is null,
In your EO the dateTime is not nullable
Net converts the null to DateTime.Min (01/01/01)
during an update this value is smaller than the allowed (for us ususally 01/01/1900)

Best fix, it to change the Datetimes in your EO & CV toall  be nullable, OR to use a CV that does not contain any of the date fields for updating, and let JCDCHelper deal with it..

See here for the codes of all Sybase datatypes : http://infocenter.sybase.com/help/index.jsp?topic=/com.sybase.help.ase_15.0.tables/html/tables/tables69.htm

Tuesday, October 30, 2012

An error occurred during local report processing. ->An error occurred during local report processing. ->ClassName

So I was Moving an RDLC Report from one applicaiton to another,

I was getting this excpetion..

(summary of the messages of the exception and it's inner exceptions:
An error occurred during local report processing. --->
 An error has occurred during report processing. --->
  StudTarReportCV

Where StudTarReportCV is the name of the class I'm passign in a list of with the reprot Data.

Not alot to go on, basically it says "Something Bad Happned with the CV class"

The Actual Problem was that the DataSet Name I was Passing it didnt' match the one defined in the RDLC.

RDLC-> StudTarReportCV
PassedToReportViewer->EFolderReportGenerator3G_CV_StudTarReportCV


So how I fixed it was to modify the XML in thie RDLC file so that the dataSet Definition matched the value i was passing in:

<DataSetName>EFolderReportGenerator3G_CV_StudTarReportCV</DataSetName>

and then modified the use of the data set in the Tablix to match there:

<DataSet Name="EFolderReportGenerator3G_CV_StudTarReportCV">
Voilia, it's all working now...
Full Text of Exception, incase anyone else runs into it:

Exception in StudentTar Ex = Microsoft.Reporting.WinForms.LocalProcessingException: An error occurred during local report processing. ---> Microsoft.ReportingServices.ReportProcessing.ProcessingAbortedException: An error has occurred during report processing. ---> Microsoft.ReportingServices.ReportProcessing.ReportProcessingException: StudTarReportCV
   at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.RunDataSetQuery()
   at Microsoft.ReportingServices.OnDemandProcessing.TablixProcessing.RuntimeOnDemandDataSet.Process()
   at Microsoft.ReportingServices.OnDemandProcessing.RuntimeDataSet.ProcessConcurrent(Object threadSet)
   --- End of inner exception stack trace ---
   at Microsoft.ReportingServices.OnDemandProcessing.OnDemandProcessingContext.AbortHelper.ThrowAbortException(String reportUniqueName)
   at Microsoft.ReportingServices.OnDemandProcessing.OnDemandProcessingContext.CheckAndThrowIfAborted()
   at Microsoft.ReportingServices.OnDemandProcessing.RetrievalManager.FetchData(Boolean mergeTran)
   at Microsoft.ReportingServices.OnDemandProcessing.RetrievalManager.PrefetchData(ReportInstance reportInstance, ParameterInfoCollection parameters, Boolean mergeTran)
   at Microsoft.ReportingServices.OnDemandProcessing.Merge.FetchData(ReportInstance reportInstance, Boolean mergeTransaction)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.ProcessOdpReport(Report report, OnDemandMetadata odpMetadataFromSnapshot, ProcessingContext pc, Boolean snapshotProcessing, Boolean reprocessSnapshot, Boolean processUserSortFilterEvent, Boolean processWithCachedData, ErrorContext errorContext, DateTime executionTime, IChunkFactory cacheDataChunkFactory, StoreServerParameters storeServerParameters, GlobalIDOwnerCollection globalIDOwnerCollection, SortFilterEventInfoMap oldUserSortInformation, EventInformation newUserSortInformation, String oldUserSortEventSourceUniqueName, ExecutionLogContext executionLogContext, OnDemandProcessingContext& odpContext)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.RenderReport(IRenderingExtension newRenderer, DateTime executionTimeStamp, ProcessingContext pc, RenderingContext rc, IChunkFactory cacheDataChunkFactory, IChunkFactory yukonCompiledDefinition, Boolean& dataCached)
   at Microsoft.ReportingServices.ReportProcessing.ReportProcessing.RenderReport(IRenderingExtension newRenderer, DateTime executionTimeStamp, ProcessingContext pc, RenderingContext rc, IChunkFactory yukonCompiledDefinition)
   at Microsoft.Reporting.LocalService.CreateSnapshotAndRender(CatalogItemContextBase itemContext, ReportProcessing repProc, IRenderingExtension renderer, ProcessingContext pc, RenderingContext rc, SubreportCallbackHandler subreportHandler, ParameterInfoCollection parameters, DatasourceCredentialsCollection credentials)
   at Microsoft.Reporting.LocalService.Render(CatalogItemContextBase itemContext, Boolean allowInternalRenderers, ParameterInfoCollection reportParameters, IEnumerable dataSources, DatasourceCredentialsCollection credentials, CreateAndRegisterStream createStreamCallback, ReportRuntimeSetup runtimeSetup)
   at Microsoft.Reporting.WinForms.LocalReport.InternalRender(String format, Boolean allowInternalRenderers, String deviceInfo, PageCountMode pageCountMode, CreateAndRegisterStream createStreamCallback, Warning[]& warnings)
   --- End of inner exception stack trace ---
   at Microsoft.Reporting.WinForms.LocalReport.InternalRender(String format, Boolean allowInternalRenderers, String deviceInfo, PageCountMode pageCountMode, CreateAndRegisterStream createStreamCallback, Warning[]& warnings)
   at Microsoft.Reporting.WinForms.LocalReport.InternalRender(String format, Boolean allowInternalRenderers, String deviceInfo, PageCountMode pageCountMode, String& mimeType, String& encoding, String& fileNameExtension, String[]& streams, Warning[]& warnings)
   at Microsoft.Reporting.WinForms.LocalReport.Render(String format, String deviceInfo, PageCountMode pageCountMode, String& mimeType, String& encoding, String& fileNameExtension, String[]& streams, Warning[]& warnings)
   at Microsoft.Reporting.WinForms.Report.Render(String format, String deviceInfo, String& mimeType, String& encoding, String& fileNameExtension, String[]& streams, Warning[]& warnings)
   at EFolderReportGenerator3G.Reporting.WinForms.ReportGenerator.GetReportResult(ReportRenderParameters reportRenderParameters) in D:\Project Files\EFolderReportGenerator3G\WinForm\EFolderReportGenerator3G.Reporting\Web\ReportGenerator.cs:line 206
   at EFolderReportGenerator3G.Reporting.WinForms.ReportGenerator.GetReportResult[T](String reportType, String dataSourceName, List`1 data, String reportFileName, List`1 reportParameters) in D:\Project Files\EFolderReportGenerator3G\WinForm\EFolderReportGenerator3G.Reporting\Web\ReportGenerator.cs:line 74
   at EFolderReportGenerator3G.BLL.BusinessObjects.ETarBLL.GetStudTarReportNew(StudTarReportArgumentCV criteria) in D:\Project Files\EFolderReportGenerator3G\WinForm\EFolderReportGenerator3G.BLL\BusinessObjects\ETarBLL.cs:line 1398
   at EFolderReportGenerator3G.BLL.BusinessObjects.ETarBLL.SaveStudTarReportNew(String& fnameExt, String& mineType, String rollingOrPy, EFolderReportArgCV args, StudentCV studentCv) in D:\Project Files\EFolderReportGenerator3G\WinForm\EFolderReportGenerator3G.BLL\BusinessObjects\ETarBLL.cs:line 1460

Thursday, October 18, 2012

JCDCHelper code to return one column of one row cleanly

lots of us when returning one column, return an object and then have to cast that to a <T>

This fixes that to work more cleanly.

public T JcdcAdoGetOneColumn<T>(string mainSql){

 object answer;
 using (IAdoHelper ado = ObjectFactory.GetNamedInstance<IAdoHelper>("JCDC")) {

  answer = ado.GetOneColumn<T>(mainSql, null); }


 return ConvertObjectToT<T>( answer );}

  private T ConvertObjectToT<T>( object answer )
{

 // handle the cast for both primitive and non primitive types - EWB if ( answer is T ) {

  return ( T ) answer; }

 else {
 try {
  return ( T ) Convert.ChangeType( answer, typeof ( T ) ); }

 catch ( InvalidCastException ) {

  return default( T ); }
}