我在尝试设置对我继承自MembershipUser的模型的期望时遇到此错误:
ContactRepositoryTests.UpdateTest:FailedSystem.InvalidProgramException:JIT编译器遇到内部限制。
服务器堆栈跟踪: 在MockObjectType1.ToString()
在[0]处重新抛出异常: 在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg,IMessage retMsg) 在System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(ref MessageData msgData,Int32 type) 在System.Object.ToString() 在NMock2.Internal.ExpectationBuilder.On(对象接收器)
以下是我正在使用的工具......
VS2008(SP1) 框架3.5 nUnit 2.4.8 nMock 2.0.0.44 Resharper 4.1
我不知道为什么会发生这种情况。任何帮助将不胜感激。
测试班......
[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);
}
}
用户类......
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
}
地址类......
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;
}
}
答案 0 :(得分:1)
刚刚解决了同样的问题。
不要将ToString()添加到接口定义。它已经包含在每个对象中。
答案 1 :(得分:0)
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();
}
有工作的犀牛模拟测试。 在rhino模拟测试中,您错过了对预期的属性调用(由Expect.call设置)
通过查看代码,您似乎在nMock场景中犯了同样的错误