Test method

Given this class:

public class OrderService
{
    public OrderService(IOrderLogger log)
    {
        this.log = log;
    }

    private readonly IOrderLogger log;

    public void PurgeOrder(Order order)
    {
        ...

        var action = new LogAction("foo","bar");
        log.Action(action);
    }
}   

And this test:

[Fact]
public void PurgeOrder_should_log_action()
{
    var order = new Order();
    var logger = MockRepository.GenerateStub<IOrderLogger>();
    var service = new OrderService(logger);

    service.PurgeOrder(order);

    logger.AssertWasCalled(x => x.Action(????));
}   

Obviously, the test is incorrect. How can I claim that OrderLogger.Action (...) was actually called in this script? If a LogAction is created inside the PurgeOrder method, I do not see how this is possible. Any suggestions?

+3
source share
3 answers

You need a way to compare LogActions. You can either implement Equals on LogAction (if that makes sense in terms of program logic), or implement a comparator as part of the tests. In the first case, you must create the same LogAction as in the production code.

+1
source

[ Typemock]

, , , , Typemock Isolator. , , " ", , " " :

[Fact]
public void PurgeOrder_should_log_action()
{
    var order = new Order();
    var logger = Isolate.Fake.Instance<IOrderLogger>();    
    var logAction = Isolate.Fake.Instance<LogAction>();
    Isolate.Swap.NextInstance<LogAction>().With(logAction);

    var service = new OrderService(logger);
    service.PurgeOrder(order);

    Isolate.Verify.WasCalledWithExactArguments(() => logger.Action(logAction));
}
+1

mocks, - EasyMock, IOrderLogger, - :

IOrderLogger log = EasyMock.createMock(IOrderLogger.class);
log.Action(EasyMock.isA(LogAction.class));
EasyMock.expectLastCall();

, Action() void. Java-esque. , EasyMock.net.

0

Source: https://habr.com/ru/post/1718831/


All Articles