views:

602

answers:

2

I am getting this error when trying to set an expectation on an object I mocked that inherits from MembershipUser:

ContactRepositoryTests.UpdateTest : FailedSystem.InvalidProgramException: JIT Compiler encountered an internal limitation.

Server stack trace: at MockObjectType1.ToString()

Exception rethrown at [0]: at System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) at System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref MessageData msgData, Int32 type) at System.Object.ToString() at NMock2.Internal.ExpectationBuilder.On(Object receiver)

Here are the tools I am using...

VS2008 (SP1) Framework 3.5 nUnit 2.4.8 nMock 2.0.0.44 Resharper 4.1

I am at a loss as to why this would be happening. Any help would be appreciated.

Test Class...

    [TestFixture]
public class AddressRepositoryTests
{
 private Mockery m_Mockery;
 private Data.IAddress m_MockDataAddress;
 private IUser m_MockUser;

 [SetUp]
 public void Setup()
 {
  m_Mockery = new Mockery();

  m_MockDataAddress = m_Mockery.NewMock<Data.IAddress>();

  m_MockUser = m_Mockery.NewMock<IUser>();
 }

 [TearDown]
 public void TearDown()
 {
  m_Mockery.Dispose();
 }

 [Test]
 public void CreateTest()
 {
  string line1 = "unitTestLine1";
  string line2 = "unitTestLine2";
  string city = "unitTestCity";
  int stateId = 1893;
  string postalCode = "unitTestPostalCode";
  int countryId = 223;
  bool active = false;
  int createdById = 1;

  Expect.Once
   .On(m_MockUser)
   .GetProperty("Identity")
   .Will(Return.Value(createdById));

  Expect.Once
   .On(m_MockDataAddress)
   .Method("Insert")
   .With(
    line1,
    line2,
    city,
    stateId,
    postalCode,
    countryId,
    active,
    createdById,
    Is.Anything
   )
   .Will(Return.Value(null));

  IAddressRepository addressRepository = new AddressRepository(m_MockDataAddress);
  IAddress address = addressRepository.Create(
   line1,
   line2,
   city,
   stateId,
   postalCode,
   countryId,
   active,
   m_MockUser
  );

  Assert.IsNull(address);
 }
}

User Class...

public interface IUser
{
 int? Identity { get; set; }
 int? CreatedBy { get; set; }
 DateTime CreatedOn { get; set; }
 int? ModifiedBy { get; set; }
 DateTime? ModifiedOn { get; set; }
 string UserName { get; }
 object ProviderUserKey { get; }
 string Email { get; set; }
 string PasswordQuestion { get; }
 string Comment { get; set; }
 bool IsApproved { get; set; }
 bool IsLockedOut { get; }
 DateTime LastLockoutDate { get; }
 DateTime CreationDate { get; }
 DateTime LastLoginDate { get; set; }
 DateTime LastActivityDate { get; set; }
 DateTime LastPasswordChangedDate { get; }
 bool IsOnline { get; }
 string ProviderName { get; }
 string ToString();
 string GetPassword();
 string GetPassword(string passwordAnswer);
 bool ChangePassword(string oldPassword, string newPassword);
 bool ChangePasswordQuestionAndAnswer(string password, string newPasswordQuestion, string newPasswordAnswer);
 string ResetPassword(string passwordAnswer);
 string ResetPassword();
 bool UnlockUser();
}

public class User : MembershipUser, IUser
{
 #region Public Properties
 private int? m_Identity;
 public int? Identity
 {
  get { return m_Identity; }
  set
  {
   if (value <= 0)
    throw new Exception("Address.Identity must be greater than 0.");

   m_Identity = value;
  }
 }

 public int? CreatedBy { get; set; }

 private DateTime m_CreatedOn = DateTime.Now;
 public DateTime CreatedOn
 {
  get { return m_CreatedOn; }
  set { m_CreatedOn = value; }
 }

 public int? ModifiedBy { get; set; }
 public DateTime? ModifiedOn { get; set; }
 #endregion Public Properties

 #region Public Constructors
 public User()
 { }
 #endregion Public Constructors

}

Address Class...

public interface IAddress
{
 int? Identity { get; set; }
 string Line1 { get; set; }
 string Line2 { get; set; }
 string City { get; set; }
 string PostalCode { get; set; }
 bool Active { get; set; }
 int? CreatedBy { get; set; }
 DateTime CreatedOn { get; set; }
 int? ModifiedBy { get; set; }
 DateTime? ModifiedOn { get; set; }
}

public class Address : IAddress
{
 #region Public Properties
 private int? m_Identity;
 public int? Identity
 {
  get { return m_Identity; }
  set
  {
   if (value <= 0)
    throw new Exception("Address.Identity must be greater than 0.");

   m_Identity = value;
  }
 }

 public string Line1 { get; set; }
 public string Line2 { get; set; }
 public string City { get; set; }
 public string PostalCode { get; set; }
 public bool Active { get; set; }

 public int? CreatedBy { get; set; }

 private DateTime m_CreatedOn = DateTime.Now;
 public DateTime CreatedOn
 {
  get { return m_CreatedOn; }
  set { m_CreatedOn = value; }
 }

 public int? ModifiedBy { get; set; }
 public DateTime? ModifiedOn { get; set; }
 #endregion Public Properties

}

AddressRepository Class...

public interface IAddressRepository
{
 IAddress Create(string line1, string line2, string city, int stateId, string postalCode, int countryId, bool active, IUser createdBy);
}

public class AddressRepository : IAddressRepository
{
 #region Private Properties
 private Data.IAddress m_DataAddress;
 private Data.IAddress DataAddress
 {
  get
  {
   if (m_DataAddress == null)
    m_DataAddress = new Data.Address();

   return m_DataAddress;
  }
  set
  {
   m_DataAddress = value;
  }
 }
 #endregion Private Properties

 #region Public Constructor
 public AddressRepository()
 { }

 public AddressRepository(Data.IAddress dataAddress)
 {
  DataAddress = dataAddress;
 }
 #endregion Public Constructor

 #region Public Methods
 public IAddress Create(string line1, string line2, string city, int stateId, string postalCode, int countryId, bool active, IUser createdBy)
 {
  if (String.IsNullOrEmpty(line1)) throw new Exception("You must enter a Address Line 1 to register.");
  if (String.IsNullOrEmpty(city)) throw new Exception("You must enter a City to register.");
  if (stateId <= 0) throw new Exception("You must select a State to register.");
  if (String.IsNullOrEmpty(postalCode)) throw new Exception("You must enter a Postal Code to register.");
  if (countryId <= 0) throw new Exception("You must select a Country to register.");

  DataSet dataSet = DataAddress.Insert(
   line1,
   line2,
   city,
   stateId,
   postalCode,
   countryId,
   active,
   createdBy.Identity,
   DateTime.Now
  );

  return null;
 }
 #endregion Public Methods
}

DataAddress Class...

public interface IAddress
{
 DataSet GetByAddressId (int? AddressId);
 DataSet Update (int? AddressId, string Address1, string Address2, string City, int? StateId, string PostalCode, int? CountryId, bool? IsActive, Guid? ModifiedBy);
 DataSet Insert (string Address1, string Address2, string City, int? StateId, string PostalCode, int? CountryId, bool? IsActive, int? CreatedBy, DateTime? CreatedOn);
}

public class Address : IAddress
{
 public DataSet GetByAddressId (int? AddressId)
 {
  Database database = DatabaseFactory.CreateDatabase();
  DbCommand dbCommand = database.GetStoredProcCommand("prAddress_GetByAddressId");
  DataSet dataSet;

  try
  {
   database.AddInParameter(dbCommand, "AddressId", DbType.Int32, AddressId);

   dataSet = database.ExecuteDataSet(dbCommand);
  }
  catch (SqlException sqlException)
  {
   string callMessage = "prAddress_GetByAddressId " + "@AddressId = " + AddressId;
   throw new Exception(callMessage, sqlException);
  }

  return dataSet;
 }

 public DataSet Update (int? AddressId, string Address1, string Address2, string City, int? StateId, string PostalCode, int? CountryId, bool? IsActive, Guid? ModifiedBy)
 {
  Database database = DatabaseFactory.CreateDatabase();
  DbCommand dbCommand = database.GetStoredProcCommand("prAddress_Update");
  DataSet dataSet;

  try
  {
   database.AddInParameter(dbCommand, "AddressId", DbType.Int32, AddressId);
   database.AddInParameter(dbCommand, "Address1", DbType.AnsiString, Address1);
   database.AddInParameter(dbCommand, "Address2", DbType.AnsiString, Address2);
   database.AddInParameter(dbCommand, "City", DbType.AnsiString, City);
   database.AddInParameter(dbCommand, "StateId", DbType.Int32, StateId);
   database.AddInParameter(dbCommand, "PostalCode", DbType.AnsiString, PostalCode);
   database.AddInParameter(dbCommand, "CountryId", DbType.Int32, CountryId);
   database.AddInParameter(dbCommand, "IsActive", DbType.Boolean, IsActive);
   database.AddInParameter(dbCommand, "ModifiedBy", DbType.Guid, ModifiedBy);

   dataSet = database.ExecuteDataSet(dbCommand);
  }
  catch (SqlException sqlException)
  {
   string callMessage = "prAddress_Update " + "@AddressId = " + AddressId + ", @Address1 = " + Address1 + ", @Address2 = " + Address2 + ", @City = " + City + ", @StateId = " + StateId + ", @PostalCode = " + PostalCode + ", @CountryId = " + CountryId + ", @IsActive = " + IsActive + ", @ModifiedBy = " + ModifiedBy;
   throw new Exception(callMessage, sqlException);
  }

  return dataSet;
 }

 public DataSet Insert (string Address1, string Address2, string City, int? StateId, string PostalCode, int? CountryId, bool? IsActive, int? CreatedBy, DateTime? CreatedOn)
 {
  Database database = DatabaseFactory.CreateDatabase();
  DbCommand dbCommand = database.GetStoredProcCommand("prAddress_Insert");
  DataSet dataSet;

  try
  {
   database.AddInParameter(dbCommand, "Address1", DbType.AnsiString, Address1);
   database.AddInParameter(dbCommand, "Address2", DbType.AnsiString, Address2);
   database.AddInParameter(dbCommand, "City", DbType.AnsiString, City);
   database.AddInParameter(dbCommand, "StateId", DbType.Int32, StateId);
   database.AddInParameter(dbCommand, "PostalCode", DbType.AnsiString, PostalCode);
   database.AddInParameter(dbCommand, "CountryId", DbType.Int32, CountryId);
   database.AddInParameter(dbCommand, "IsActive", DbType.Boolean, IsActive);
   database.AddInParameter(dbCommand, "CreatedBy", DbType.Int32, CreatedBy);
   database.AddInParameter(dbCommand, "CreatedOn", DbType.DateTime, CreatedOn);

   dataSet = database.ExecuteDataSet(dbCommand);
  }
  catch (SqlException sqlException)
  {
   string callMessage = "prAddress_Insert " + "@Address1 = " + Address1 + ", @Address2 = " + Address2 + ", @City = " + City + ", @StateId = " + StateId + ", @PostalCode = " + PostalCode + ", @CountryId = " + CountryId + ", @IsActive = " + IsActive + ", @CreatedBy = " + CreatedBy + ", @CreatedOn = " + CreatedOn;
   throw new Exception(callMessage, sqlException);
  }

  return dataSet;
 }
}
A: 
 public interface IUser
    {

        // Base class public properties
        string UserName { get; }
        object ProviderUserKey { get; }
        string Email { get; set; }
        string PasswordQuestion { get; }
        string Comment { get; set; }
        bool IsApproved { get; set; }
        bool IsLockedOut { get; }
        DateTime LastLockoutDate { get; }
        DateTime CreationDate { get; }
        DateTime LastLoginDate { get; set; }
        DateTime LastActivityDate { get; set; }
        DateTime LastPasswordChangedDate { get; }
        bool IsOnline { get; }
        string ProviderName { get; }
        string ToString();
        string GetPassword();
        string GetPassword(string passwordAnswer);
        bool ChangePassword(string oldPassword, string newPassword);
        bool ChangePasswordQuestionAndAnswer(string password, string newPasswordQuestion, string newPasswordAnswer);
        string ResetPassword(string passwordAnswer);
        string ResetPassword();
        bool UnlockUser();
    }


    public class Caller
    {
        public Caller(IUser newUser)
        {
            user = newUser;
        }


        public IUser user { get; private set; }
    }


    [Test]
    public void RhinoTest()
    {
        var userId = Guid.NewGuid();
        var mocks = new MockRepository();
        var mockUser = mocks.StrictMock<IUser>();
        var caller = new Caller(mockUser);

        Expect.Call(mockUser.ProviderUserKey).Return(userId);


        mocks.ReplayAll();
        var userFromCaller = caller.user.ProviderUserKey;
        Assert.AreEqual(userId, userFromCaller, "Incorrect userId");

        mockUser.VerifyAllExpectations();
    }


    [Test]
    public void AnotherRhinoTest()
    {
        var userId = Guid.NewGuid();
        var mockUser = MockRepository.GenerateMock<IUser>();
        var caller = new Caller(mockUser);

        mockUser.Expect(m=>m.ProviderUserKey).Return(userId);

        var userFromCaller = caller.user.ProviderUserKey;

        Assert.AreEqual(userId, userFromCaller, "Incorrect userId");

        mockUser.VerifyAllExpectations();

    }

there are the working rhino mock tests. In rhino mock test you were missing the call to property which was being expected (as set by Expect.call)

From by looking at the code, it seems you are doing the same mistake in nMock scenario

scorpio
I am not sure I understand RhinoMock.. I tried setting it up quickly because I was afraid it was an nMock problem. If you are familiar with nMock can you show me what you are talking about? What you are saying isn't quite clicking for me....I didn't put all the nMock code, I'll update it...
A: 

Just solved same problem.

DO NOT add ToString() to interface definition. It is already contained in every object.

Pasi Savolainen