给出了确保防止在类参数中分配错误的值的单元测试,如何编写一个将其考虑在内的方法?

问题描述 投票:1回答:1

最近向我介绍了测试驱动开发。但是,我很难理解它。给出了以下单元测试:

public void Setup()
{
    invoicePosition = new InvoicePosition{
        Customer = new Customer(),
        ItemIdentifier = 0,
        ItemName = "SpringRoll",
        Orders = 2,
        SingleUnitPrice = 3.50m
    };

    pairs = new KeywordPair[]{
        new KeywordPair(new Keyword("ItemNumber"),invoicePosition.ItemIdentifier.ToString()),
        new KeywordPair(new Keyword("ItemName"), invoicePosition.ItemName),
        new KeywordPair(new Keyword("CustomerName"), invoicePosition.Customer.Name),
        new KeywordPair(new Keyword("AmountOrdered"), invoicePosition.Orders.ToString()),
        new KeywordPair(new Keyword("NetPrice"), invoicePosition.SingleUnitPrice.ToString())
    };
}

[Test]
public void Invoice_CreateOrderOrderedInput_Valid(){
    var invoice = InvoicePosition.CreateFromPairs(pairs);
    Assert.AreEqual(invoicePosition.ItemIdentifier, invoice.ItemIdentifier);
    Assert.AreEqual(invoicePosition.ItemName.GetType(), invoice.ItemName.GetType());
    Assert.AreEqual(invoicePosition.Customer.Name, invoice.Customer.Name);
    Assert.AreEqual(invoicePosition.Orders, invoice.Orders);
    Assert.AreEqual(invoicePosition.SingleUnitPrice, invoice.SingleUnitPrice);
}

请注意,关键字和关键字结构如下:

public struct Keyword
{
        private string keyword;
        private KeywordTypes type;

        public Keyword(string keyword, KeywordTypes Type = KeywordTypes.String){
            this.keyword = keyword;
            this.type = Type;
}

public struct KeywordPair
{
        public Keyword Key;
        public string Value;

        public KeywordPair(Keyword key, string value)
        {
            this.Key = key;
            this.Value = value;
        }
}

现在,我已经为先前的单元测试编写了以下项目:命名空间SimpleShop

    public class InvoicePosition
    {
        public uint ItemIdentifier = 0;
        public string ItemName = "";
        public uint Orders = 0;
        public decimal SingleUnitPrice = 0.0m;
        public Customer Customer;
        public KeywordPair[] Pairs = new KeywordPair[0];

        public static InvoicePosition CreateFromPairs(KeywordPair[] pairs)
        {
            var invoice = new InvoicePosition();
            invoice.Pairs = pairs;
            return invoice;
        }          
    }

我需要编写说明错误序列化的代码。例如,如果将配对引入程序,如下所示:

pairs[3] = new KeywordPair(new Keyword("AmountOrdered"), "+%&/" + invoicePosition.Orders.ToString());
pairs[4] = new KeywordPair(new Keyword("NetPrice"), invoicePosition.SingleUnitPrice.ToString() + 
"%&öä/");

谢谢,任何帮助都将非常有用。

c# unit-testing tdd
1个回答
0
投票

给出测试Invoice_CreateOrderOrderedInput_Valid,OP中建议的InvoicePosition 未通过测试。通过使用Visual Studio的各种重构工具,这样的事情就是可能工作的最简单的事情:

public class InvoicePosition
{
    public Customer Customer { get; set; }
    public int ItemIdentifier { get; set; }
    public string ItemName { get; set; }
    public int Orders { get; set; }
    public decimal SingleUnitPrice { get; set; }

    public static InvoicePosition CreateFromPairs(KeywordPair[] pairs)
    {
        return new InvoicePosition
        {
            ItemName = "",
            Customer = new Customer(),
            Orders = 2,
            SingleUnitPrice = 3.5m
        };
    }
}

CreateFromPairs实现显然不是完整或正确的实现,但它通过了所有测试。 TDD面临的挑战是弄清楚接下来要编写哪个测试。

TDD最有效,如果您可以以尽可能小的步长前进。您可能需要考虑Transformation Priority Premise。您首先要解决不正确实施的哪一部分?

也许您不满意ItemName被硬编码为空字符串。您如何编写新的测试来鼓励您使实现更通用?

我将编写另一个测试,以使第一个测试的所有内容保持不变,except ItemName值。

Setup当前的测试结构方式很不方便。我建议您改写parametrised tests

© www.soinside.com 2019 - 2024. All rights reserved.