【问题标题】:Check if an object exist in expected list检查预期列表中是否存在对象
【发布时间】:2020-06-16 04:13:27
【问题描述】:

我有这个类 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);
    }
}

这是我对InsertTransaction 方法的 xUnit 单元测试,除了支持检查trans 对象是否存在于expected 列表中的expected.Should().Contain(trans); 之外,该方法有效。

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

【问题讨论】:

    标签: c# unit-testing xunit


    【解决方案1】:

    更改方法以更明确地断言预期行为:

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

    【讨论】:

      猜你喜欢
      • 2016-04-02
      • 2013-12-23
      • 1970-01-01
      • 1970-01-01
      • 2012-07-27
      • 2018-01-06
      • 2013-09-26
      • 1970-01-01
      相关资源
      最近更新 更多