0

MembershipUser から継承するモックしたオブジェクトに期待値を設定しようとすると、次のエラーが発生します。

ContactRepositoryTests.UpdateTest : FailedSystem.InvalidProgramException: JIT コンパイラで内部制限が発生しました。

サーバー スタック トレース: MockObjectType1.ToString() で

[0] で例外が再スローされました: System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) で.ToString() at 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 クラス...

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
}

データアドレス クラス...

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

2 に答える 2

1

同じ問題を解決しました。

インターフェイス定義に ToString() を追加しないでください。それはすでにすべてのオブジェクトに含まれています。

于 2009-05-28T11:38:31.360 に答える
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 模擬テストがあります。rhino モック テストでは、期待されていたプロパティへの呼び出しがありませんでした (Expect.call によって設定されます)。

コードを見ると、nMock シナリオで同じ間違いをしているようです

于 2009-04-03T09:01:09.993 に答える