2009-04-02 21 views
0

Je reçois cette erreur en essayant de définir une attente sur un objet que je moquais héritant de MembershipUser:Impossible d'utiliser la routine NMock GetProperty sur une propriété d'un objet hérité

ContactRepositoryTests.UpdateTest: FailedSystem.InvalidProgramException: JIT Le compilateur a rencontré une limitation interne.

trace de pile du serveur: à MockObjectType1.ToString()

Exception relancée à [0]: à System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage (IMessage reqMsg, IMessage retMsg) au système. Runtime.Remoting.Proxies.RealProxy.PrivateInvoke (réf MessageData MSGDATA, le type Int32) à System.Object.ToString() à NMock2.Internal.ExpectationBuilder.On (récepteur Object)

Voici les outils que je me sers ...

VS2008 (SP1) Framework 3.5 nUnit 2.4.8 NMock 2.0.0.44 ReSharper 4.1

Je suis à une perte pour expliquer pourquoi cela se produirait. Toute aide serait appréciée.

classe test ...

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

classe utilisateur ...

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 

} 

classe Adresse ...

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 classe ...

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 classe ...

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

Mise à jour pour inclure tout le fichier de classe sable complet UnitTest –

Répondre

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(); 

    } 

il y a les essais simulés de RHINO. Dans test de simulation de rhinocéros vous manque l'appel à la propriété qui était prévu (tel que défini par Expect.call)

De en regardant le code, il semble que vous faites la même erreur dans le scénario NMock

+0

Je ne suis pas sûr de comprendre RhinoMock .. J'ai essayé de le configurer rapidement parce que j'avais peur que ce soit un problème nMock. Si vous connaissez nMock, pouvez-vous me montrer de quoi vous parlez? Ce que vous dites n'est pas tout à fait en cliquant pour moi .... Je n'ai pas mis tout le code nMock, je vais le mettre à jour ... –

1

Juste résolu le même problème.

NE PAS ajouter ToString() à la définition de l'interface. Il est déjà contenu dans chaque objet.