Проверить, существует ли объект в ожидаемом списке - PullRequest
0 голосов
/ 16 июня 2020

У меня есть этот класс POCO

public class BankTransaction
{
    public int Id { get; set; }
    public decimal TransactionAmount { get; set; }
    public TransactionTypeEnum TransactionType { get; set; }
    public int BankAccountId { get; set; }

    public BankTransaction(decimal TransactionAmount)
    {
        this.TransactionAmount = TransactionAmount;
    }
}

public enum TransactionTypeEnum
{
    Deposit, Withdraw, ThirdPartyTransfer
}

, и этот класс репозитория вставляет транзакцию

public class BankTransactionRepository : IBankTransactionRepository
{
    // Mock DB
    public List<BankTransaction> bankTransactions { get; private set; }

    public BankTransactionRepository()
    {
        bankTransactions = new List<BankTransaction>();
    }

    public void InsertTransaction(BankTransaction bankTransaction)
    {
        bankTransactions.Add(bankTransaction);
    }
}

, а вот мой модульный тест xUnit для метода InsertTransaction, который работает, за исключением expected.Should().Contain(trans);, который поддерживает проверку наличия объекта trans в списке expected.

public class BankTransactionsTest
{
    private BankTransactionRepository _bankTransaction;

    public BankTransactionsTest()
    {
        _bankTransaction = new BankTransactionRepository();
    }

    // Arrange
    [Theory, MemberData(nameof(InsertTransaction_InsertShouldPass_Data))]
    public void InsertTransaction_InsertShouldPass(BankTransaction trans, List<BankTransaction> expected)
    {
        // Act
        _bankTransaction.InsertTransaction(trans);

        // Assert
        Assert.Equal(expected.Count, _bankTransaction.bankTransactions.Count);

        // Fluent Assertions to check if trans is in 'expected' list.
        expected.Should().Contain(trans);
    }

    public static TheoryData<BankTransaction, List<BankTransaction>> InsertTransaction_InsertShouldPass_Data()
    {
        return new TheoryData<BankTransaction, List<BankTransaction>>
        {
            {
                new BankTransaction(200.00M),
                new List<BankTransaction>(){new BankTransaction(200.00M)}              
            },
            {
                new BankTransaction(50.50M),
                new List<BankTransaction>(){new BankTransaction(50.50M)}
            },
        };
    }
}

1 Ответ

1 голос
/ 16 июня 2020

Измените подход, сделав более явным утверждение ожидаемого поведения:

То, что объект, вставленный при вызове InsertTransaction, действительно содержится в тестируемом объекте.

public class BankTransactionsTest
{
    private BankTransactionRepository _bankTransaction;

    public BankTransactionsTest()
    {
        _bankTransaction = new BankTransactionRepository();
    }

    // Arrange
    [Theory, MemberData(nameof(InsertTransaction_InsertShouldPass_Data))]
    public void InsertTransaction_InsertShouldPass(BankTransaction transaction)
    {
        // Act
        _bankTransaction.InsertTransaction(transaction);

        // Assert
        _bankTransaction.bankTransactions.Should().ContainEquivalentOf(transaction);
    }

    public static TheoryData<BankTransaction> InsertTransaction_InsertShouldPass_Data()
    {
        return new TheoryData<BankTransaction>
        {
            new BankTransaction(200.00M),
            new BankTransaction(50.50M)
        };
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...