jeudi 30 juillet 2015

Moq - Invocation count does not match

I appear to be having an issue when I go to verify the number of times a method has been called with certain arguments. I've pasted the relevant code and unit test below. My unit test is failing saying that the first Update of InventoryTransferItem is not being called at all; while the second is being called twice. I've tried simplifying out the arguments section to only look at the transferType; but still get the error. Debugging the code shows that the correct values are being passed through. It feels like I'm missing something, but can't quite put my finger on it.

Error messages:

Expected invocation on the mock once, but was 0 times: t => t.Update(It.Is<InventoryTransferItemTransaction>(args => (((((!(args.Created.IsNull()) && args.CreatedBy == User.GetNameFromContext()) && args.InventoryTransferItemId == 12) && !(args.Modified.IsNull())) && args.ModifiedBy == User.GetNameFromContext()) && args.Quantity == -10) && (Int32)args.TransactionType == 2))

Expected invocation on the mock once, but was 2 times: t => t.Update(It.Is<InventoryTransferItemTransaction>(args => (((((!(args.Created.IsNull()) && args.CreatedBy == User.GetNameFromContext()) && args.InventoryTransferItemId == 12) && !(args.Modified.IsNull())) && args.ModifiedBy == User.GetNameFromContext()) && args.Quantity == 0) && (Int32)args.TransactionType == 5))

Unit Test:

[Test]
public void CanRemoveTransferItem()
{
    const int TRANSFER_ITEM_ID = 12;
    const int QTY = 10;
    var inventoryTransferFactoryMock = new Mock<IInventoryTransferFactory>();
    inventoryTransferFactoryMock.Setup(t => t.GetTransferItem(TRANSFER_ITEM_ID))
                         .Returns(new InventoryTransferItem
                             {
                                 InventoryTransferItemId = TRANSFER_ITEM_ID,
                                 Quantity = QTY
                             });
    inventoryTransferFactoryMock.Setup(t => t.CreateInventoryTransferItemTransaction())
                                .Returns(new InventoryTransferItemTransaction());
    var inventoryTransferManager = new InventoryTransferManager(inventoryTransferFactoryMock.Object, null, null,
                                                                null, null);
    inventoryTransferManager.RemoveTransferItem(TRANSFER_ITEM_ID);
    inventoryTransferFactoryMock.Verify(t=>t.GetTransferItem(TRANSFER_ITEM_ID), Times.Once);
    inventoryTransferFactoryMock.Verify(
        t =>
        t.Update(
            It.Is<InventoryTransferItem>(
                args =>
                args.Quantity == 0 && args.ModifiedBy == User.GetNameFromContext() &&
                !args.Modified.IsNull() && !args.ClosedDate.IsNull())), Times.Once);
    inventoryTransferFactoryMock.Verify(t => t.CreateInventoryTransferItemTransaction(), Times.Exactly(2));
    inventoryTransferFactoryMock.Verify(
        t =>
        t.Update(It.Is<InventoryTransferItemTransaction>(
            args =>
            !args.Created.IsNull() && args.CreatedBy == User.GetNameFromContext() &&
            args.InventoryTransferItemId == TRANSFER_ITEM_ID &&
            !args.Modified.IsNull() && args.ModifiedBy == User.GetNameFromContext() &&
            args.Quantity == -QTY &&
            args.TransactionType == InventoryTransferTransactionType.TransferAdjusted)), Times.Once);
    inventoryTransferFactoryMock.Verify(
        t =>
        t.Update(It.Is<InventoryTransferItemTransaction>(
            args =>
            !args.Created.IsNull() && args.CreatedBy == User.GetNameFromContext() &&
            args.InventoryTransferItemId == TRANSFER_ITEM_ID &&
            !args.Modified.IsNull() && args.ModifiedBy == User.GetNameFromContext() &&
            args.Quantity == 0 &&
            args.TransactionType == InventoryTransferTransactionType.ClosedManually)), Times.Once);
}

RemoveTransferItem:

public void RemoveTransferItem(int inventoryTransferItemId)
{
    using (var trx = new TransactionWrapper())
    {
        var transferItem = inventoryTransferFactory.GetTransferItem(inventoryTransferItemId);
        transferItem.Modified = DateTime.Now;
        transferItem.ModifiedBy = User.GetNameFromContext();
        var originalQuantity = transferItem.Quantity;
        transferItem.Quantity = 0;
        transferItem.ClosedDate = DateTime.Now;
        inventoryTransferFactory.Update(transferItem);
        LogTransferItemTransaction(transferItem.InventoryTransferItemId, InventoryTransferTransactionType.TransferAdjusted, -originalQuantity);
        LogTransferItemTransaction(transferItem.InventoryTransferItemId, InventoryTransferTransactionType.ClosedManually, 0);
        trx.Complete();
    }
}

LogTransferItemTransaction:

internal void LogTransferItemTransaction(int transferItemId, InventoryTransferTransactionType transferType, int quantity, int? employeeId = null)
{
    var newTransaction = inventoryTransferFactory.CreateInventoryTransferItemTransaction();
    newTransaction.Created = DateTime.Now;
    newTransaction.CreatedBy = User.GetNameFromContext();
    newTransaction.EmployeeId = employeeId;
    newTransaction.InventoryTransferItemId = transferItemId;
    newTransaction.Modified = DateTime.Now;
    newTransaction.ModifiedBy = User.GetNameFromContext();
    newTransaction.Quantity = quantity;
    newTransaction.TransactionType = transferType;
    inventoryTransferFactory.Update(newTransaction);
}

Aucun commentaire:

Enregistrer un commentaire