Unable to use nMock GetProperty routine on a property of an inherited object...

Posted by Chris on Stack Overflow See other posts from Stack Overflow or by Chris
Published on 2009-04-02T17:43:01Z Indexed on 2011/01/09 11:54 UTC
Read the original article Hit count: 303

Filed under:
|
|
|
|

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;
	}
}

© Stack Overflow or respective owner

Related posts about c#

Related posts about unit-testing