3 Stimmen

Einheitstests stubben Methode

Angenommen, diese Klasse:

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

Und dieser Test:

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

    service.PurgeOrder(order);

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

Offensichtlich ist der Test falsch. Wie kann ich überprüfen, ob OrderLogger.Action(...) tatsächlich in diesem Szenario aufgerufen wurde? Wenn die LogAction innerhalb der Methode PurgeOrder instanziiert wird, sehe ich nicht, wie das möglich ist. Irgendwelche Vorschläge?

1voto

Grzenio Punkte 34566

Sie benötigen eine Möglichkeit, LogActions zu vergleichen. Sie können entweder Equals auf LogAction implementieren (wenn es aus dem Programmlogikpunkt Sinn macht), oder einen Vergleicher als Teil der Tests implementieren. Im ersten Fall würden Sie den gleichen LogAction wie im Produktionscode erstellen.

1voto

Dror Helper Punkte 29647

[Haftungsausschluss: Ich arbeite bei Typemock]

Soweit ich weiß, ist das einzige Werkzeug, das Erwartungen setzen und überprüfen kann, ob Methoden aufgerufen wurden, Typemock Isolator. Die Zukunft, nach der Sie suchen, heißt "Zukunftsobjekte". Sie helfen dabei, das Verhalten festzulegen und zu überprüfen, dass sie bei Objekten "erstellt werden", die innerhalb des zu testenden Codes erstellt werden:

[Tatsache]
public void PurgeOrder_should_log_action()
{
    var order = new Order();
    var logger = Isolate.Fake.Instance();    
    var logAction = Isolate.Fake.Instance();
    Isolate.Swap.NextInstance().With(logAction);

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

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

0voto

jaketrent Punkte 1163

Ich würde Mocks verwenden, etwas wie EasyMock, wo Sie den IOrderLogger mocken könnten und dann so etwas tun könnten:

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

Dies setzt voraus, dass Action() void zurückgibt. Dies ist eine sehr Java-ähnliche Methode, dies zu tun. Ich bin mir nicht sicher, wie weit EasyMock.net gekommen ist.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X