Форматирование данных в Fitnesse RowFixture

Добавьте этот ModelCollection.cs в свои модели

using System;
using System.Collections.Generic;

namespace ModelContainer
{
  public class ModelCollection
  {
   private Dictionary<Type, object> models = new Dictionary<Type, object>();

   public void AddModel<T>(T t)
   {
      models.Add(t.GetType(), t);
   }

   public T GetModel<T>()
   {
     return (T)models[typeof(T)];
   }
 }
}

Контроллер:

public class SampleController : Controller
{
  public ActionResult Index()
  {
    var model1 = new Model1();
    var model2 = new Model2();
    var model3 = new Model3();

    // Do something

    var modelCollection = new ModelCollection();
    modelCollection.AddModel(model1);
    modelCollection.AddModel(model2);
    modelCollection.AddModel(model3);
    return View(modelCollection);
  }
}

Вид:

enter code here
@using Models
@model ModelCollection

@{
  ViewBag.Title = "Model1: " + ((Model.GetModel<Model1>()).Name);
}

<h2>Model2: @((Model.GetModel<Model2>()).Number</h2>

@((Model.GetModel<Model3>()).SomeProperty
7
задан Ben Fulton 23 September 2008 в 14:58
поделиться

2 ответа

Вы, конечно, не хотите изменять свою Бизнес-логику только, чтобы заставить Ваши тесты выглядеть лучше. Хорошие новости однако, существует способ выполнить это, которое не является трудным, но не столь легким как передающий в спецификаторе формата.

Попытайтесь думать о своем Пригодном Приспособлении как услуга граница между FitNesse и Вашим кодом приложения. Вы хотите определить контракт, который должен не обязательно измениться, если детали реализации Вашего SUT (Система Под Тестом) изменяются.

Позволяет взгляду на упрощенную версию Вашего Бизнес-объекта:

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

Becuase способа, которым работает RowFixture, мы должны определить простой объект, который будет работать контрактом. Обычно мы использовали бы интерфейс, но это не собирается служить нашей цели здесь, таким образом, простой DTO (Объект Передачи данных) будет достаточен.

Что-то вроде этого:

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

Теперь мы можем определить RowFixture, который возвратит список наших пользовательских объектов DTO. Мы также должны создать способ преобразовать BusinessObjects в ReturnRowDTOs. Мы заканчиваем с Приспособлением, которое выглядит примерно так.

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, не повреждая фактические Пригодные Тесты.Надеюсь, это поможет.

4
ответ дан 7 December 2019 в 14:39
поделиться

Я не уверен, каков "polution". Любой, который требование - то, что Ваш Бизнес-объект возвращает значение, выраженное как процент, в этом случае Ваш бизнес-объект, должен предложить это - ИЛИ Вы тестируете истинное значение ответа как плавание, которое Вы имеете теперь.

Попытка заставить fitnesse массажировать значение для удобочитаемости кажется немного нечетной.

0
ответ дан 7 December 2019 в 14:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: