Носорог, утверждающий. IsNotNull не удалось - PullRequest
0 голосов
/ 13 февраля 2012

Я застрял с проблемой Rhino Mock.Я перепробовал все, но мой тест всегда терпел неудачу.Странно то, что в прошлый четверг я запустил модульное тестирование в одиночку, и это сработало.Затем я запустил все модульные тесты вместе, и некоторые из них были провалены.(wtf ??) Один из них следующий:

public interface IOrder
{
    Allocation GetAllocation();
    Group GetParentGroup();
}
public class Order : IOrder
{
    public virtual int Id { get; set; }
    public virtual GroupMembership ParentGroupMembership { get; set; }

    public virtual Allocation GetAllocation()
    {
        var parentGroup = GetParentGroup();
        return parentGroup.GetAllocationForOrder( this );
    }

    public virtual Group GetParentGroup()
    {
        return ParentGroupMembership.ParentGroup;
    }
}

public interface IGroupMembership
{

}
public class GroupMembership : IGroupMembership
{
    public virtual int Id { get; set; }
    public virtual Group ParentGroup { get; set; }
    public virtual Order Order { get; set; }
}

public interface IGroup
{
    Allocation GetAllocationForOrder( Order order );
}
public class Group : IGroup
{
    public virtual int Id { get; set; }
    public virtual ICollection<Allocation> Allocations { get; private set; }

    public Group()
    {
        Allocations = new List<Allocation>();
    }

    public virtual Allocation GetAllocationForOrder( Order order )
    {
        return Allocations.Single( a => a.OrderId == order.Id );
    }
}

public interface IAllocation
{

}
public class Allocation : IAllocation
{
    public virtual int Id { get; set; }
    public virtual int OrderId { get; set; }
}

[TestMethod]
public void TestGetAllocation()
{
    var order = MockRepository.Stub<Order>();
    order.Id = 1;

    var parentGroupMembership = MockRepository.Stub<GroupMembership>();
    parentGroupMembership.Id = 2;

    var parentGroup = MockRepository.Stub<Group>();
    parentGroup.Id = 3;

    parentGroupMembership.ParentGroup = parentGroup;
    order.ParentGroupMembership = parentGroupMembership;

    var allocation = new Allocation { Id = 4, OrderId = 1 };

    using ( MockRepository.Record() )
    {
        Expect.Call( order.GetParentGroup() ).Return( parentGroup );
        Expect.Call( parentGroup.GetAllocationForOrder( order ) ).Return( allocation );
    }
    using ( MockRepository.Playback() )
    {
        var actual = order.GetAllocation();

        Assert.IsNotNull( actual );
        Assert.AreEqual( actual.OrderId, allocation.OrderId );
    }
}

Проблема в том, что утверждение IsNotNull всегда терпит неудачу.Зачем?В разделе записи я настроил его на возвращение с ребенком.Я не понимаю этоМожет быть, это происходит из-за коллекции «Дети», но как в этом случае издеваться над этой коллекцией?

Большое спасибо, Маэстро

1 Ответ

2 голосов
/ 13 февраля 2012

Вы можете заглушить только виртуальные методы с Rhino Mocks.Поэтому убедитесь, что ваш метод GetChild является виртуальным, в остальном ваш Expect.Call( parent.GetChild( null ) ).Return( child ); не имеет смысла для не виртуального метода.Вы не можете определить ожидания для не виртуальных участников.

Поэтому попробуйте объявить метод как виртуальный:

public virtual Child GetChild(ChildIdentifier identifier)

Кроме того, синтаксис Record / Playback в Rhino Mocks, который вы используете в своем примере, устарел в пользу AAAсинтаксис (на самом деле это устаревание произошло еще в 2008 году, когда был введен синтаксис AAA).

Также ваш модульный тест сложен для понимания.Что именно вы здесь тестируете?Метод, который вы пытаетесь использовать для модульного тестирования, - это метод, для которого вы определяете ожидания - GetChild.Это странно, а не как насмешка предназначена для использования.Вы имитируете только те зависимости, на которые опирается тестируемый метод.Вы определяете ожидания для этих зависимостей, чтобы управлять потоком тестируемого метода и утверждать различные сценарии.


ОБНОВЛЕНИЕ:

Вместо:

var order = MockRepository.Stub<Order>();

вы должны использовать:

var order = MockRepository.PartialMock<Order>();

для создания экземпляра тестируемого субъекта.

Если вы используете метод Stub, то фактический метод, который вы пытаетесь выполнить модульным тестом здесь (order.GetAllocation) никогда не будет поражен.

...