簡體   English   中英

無法驗證方法調用-Rhino模擬

[英]Unable to verify method call - Rhino mock

我收到一個異常:“對象引用未設置為對象的實例”。

我正在嘗試評估是否執行了位置和制造類方法ResetAllProperties()。

我做錯了什么?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using Rhino.Mocks;

namespace Test
{
    public class Engine
    {
        public Engine() { }

        public EngineStatus Status { get; internal set; }
        public virtual EngineLocation Location { get; set; }
        public virtual EngineManufacturing Manufacturing { get; set; }
    }

    public abstract class EngineStatus
    {
        protected readonly Engine engine = null;

        public EngineStatus(Engine engine)
        {
            this.engine = engine;
        }

        public abstract void ResetAllProperties();
    }

    public class FirstEngineStatus : EngineStatus
    {
        public FirstEngineStatus(Engine engine) : base(engine) { }

        public override void ResetAllProperties()
        {
            this.engine.Location.ResetAllProperties();
            this.engine.Manufacturing.ResetAllProperties();
        }
    }

    public class EngineLocation
    {
        public string CustomerName { get; set; }

        public virtual EngineManufacturing Manufacturing { get; set; }
        public virtual Engine Engine { get; set; }

        public void ResetAllProperties()
        {
            this.CustomerName = null;
        }
    }

    public class EngineManufacturing
    {
        public Nullable<DateTime> EntryDate { get; set; }

        public virtual EngineLocation Location { get; set; }
        public virtual Engine Engine { get; set; }

        public void ResetAllProperties()
        {
            this.EntryDate = null;
        }
    }

    [TestClass]
    public class Test
    {
        [TestMethod]
        public void ResetAllProperties_AssertWasCalled()
        {
            // Arrange
            var engine = MockRepository.GenerateMock<Engine>();
            var status = MockRepository.GeneratePartialMock<FirstEngineStatus>(engine);

            engine.Stub(action => action.Location.ResetAllProperties());
            engine.Stub(action => action.Manufacturing.ResetAllProperties());

            // Act
            status.ResetAllProperties();

            // Assert
            engine.AssertWasCalled(action => action.Location.ResetAllProperties());
            engine.AssertWasCalled(action => action.Manufacturing.ResetAllProperties());
        }
    }
}

您要斷言LocationManufacturing的行為,因此這些是應被模擬的對象。 另外,在檢查是否發生了某些事情時,請使用Expects not Stub 其他一切都應該是具體的。 如果將ResetAllProperties方法ResetAllProperties虛擬,則可以進行以下操作:

[TestMethod]
public void ResetAllProperties_AssertWasCalled()
{
    var location = MockRepository.GeneratePartialMock<EngineLocation>();
    var manufacturing = MockRepository.GeneratePartialMock<EngineManufacturing>();

    // Arrange
    var engine = new Engine
    {
        Location = location,
        Manufacturing = manufacturing
    };
    var status = new FirstEngineStatus(engine);
    location.Expect(action => action.ResetAllProperties());
    manufacturing.Expect(action => action.ResetAllProperties());

    // Act
    status.ResetAllProperties();

    // Assert
    location.VerifyAllExpectations();
    manufacturing.VerifyAllExpectations();
}

但是,似乎您正在測試實現而不是功能。 您實際上要測試什么? 在我看來,您想要測試將CustomerNameEntryDate設置為null。 您可以完全不使用任何模擬就進行測試,如下所示:

[TestMethod]
public void ResetAllProperties_AssertWasCalled()
{
    // Arrange
    var engine = new Engine
    {
        Location = new EngineLocation { CustomerName = "Dzenan" },
        Manufacturing = new EngineManufacturing { EntryDate = DateTime.Today }
    };
    var status = new FirstEngineStatus(engine);

    // Act
    status.ResetAllProperties();

    // Assert
    Assert.IsNull(engine.Location.CustomerName);
    Assert.IsNull(engine.Manufacturing.EntryDate);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM