7

我有一个返回业务对象列表的 Fitnesse RowFixture。该对象有一个字段,它是一个代表 0 和 1 之间百分比的浮点数。业务对象的使用者将是来自设计者的网页或报告,因此百分比的格式将取决于设计者而不是业务对象。

如果页面可以在将数字转换为百分比时模拟设计器会更好,即显示 50% 而不是显示 0.5。但我宁愿不要用显示代码污染业务对象。有没有办法在 RowFixture 中指定格式字符串?

4

2 回答 2

4

您当然不想仅仅为了让您的测试看起来更好而修改您的业务逻辑。然而,好消息是,有一种方法可以做到这一点,这并不困难,但不像传递格式说明符那么容易。

尝试将您的 Fit Fixture 视为 FitNesse 和您的应用程序代码之间的服务边界。如果您的SUT系统测试)的实施细节发生变化,您想要定义一个不一定要更改的合同。

让我们看一下您的业务对象的简化版本:

public class BusinessObject
{
    public float Percent { get; private set; }
}

由于 RowFixture 的工作方式,我们需要定义一个简单的对象来作为合约工作。通常我们会使用一个接口,但这并不能满足我们的目的,所以一个简单的DTOData Transfer O bject)就足够了。

像这样的东西:

public class ReturnRowDTO
{
    public String Percent { get; set; }
}

现在我们可以定义一个 RowFixture 来返回我们自定义 DTO 对象的列表。我们还需要创建一种将 BusinessObjects 转换为 ReturnRowDTO 的方法。我们最终得到一个看起来像这样的 Fixture。

public class ExampleRowFixture: fit.RowFixture
    {
        private ISomeService _someService;

        public override object[] Query()
        {
            BusinessObject[] list = _someService.GetBusinessObjects();

            return Array.ConvertAll(list, new Converter<BusinessObject, ReturnRowDTO>(ConvertBusinessObjectToDTO));
        }

        public override Type GetTargetClass()
        {
            return typeof (ReturnRowDTO);
        }

        public ReturnRowDTO ConvertBusinessObjectToDTO(BusinessObject businessObject)
        {
            return new ReturnRowDTO() {Percent = businessObject.Percent.ToString("%")};
        }
    }

您现在可以在不破坏实际拟合测试的情况下更改您的基础 BusinessObjects。希望这可以帮助。

于 2008-09-19T21:58:48.023 回答
0

我不确定“污染”是什么。要么要求您的业务对象返回一个以百分比表示的值,在这种情况下,您的业务对象应该提供该值 - 或者 - 您正在测试响应的真实值作为您现在拥有的浮点数。

试图让健身来按摩可读性的价值似乎有点奇怪。

于 2008-09-19T19:57:58.827 回答