redirect_to с помощью POST в направляющих

Существуют некоторые превосходные ответы здесь, но если Вы ищете конкретную причину, посмотрите не далее, чем Поблочное тестирование.

Полагайте, что Вы хотите протестировать метод в бизнес-логике, которая получает текущую налоговую ставку для региона, где транзакция происходит. Чтобы сделать это, класс бизнес-логики должен говорить с базой данных через Репозиторий:

interface IRepository<T> { T Get(string key); }

class TaxRateRepository : IRepository<TaxRate> {
    protected internal TaxRateRepository() {}
    public TaxRate Get(string key) {
    // retrieve an TaxRate (obj) from database
    return obj; }
}

Всюду по коду используйте тип IRepository вместо TaxRateRepository.

Репозиторий имеет непубличного конструктора, чтобы поощрить пользователей (разработчики) использовать фабрику для инстанцирования репозитория:

public static class RepositoryFactory {

    public RepositoryFactory() {
        TaxRateRepository = new TaxRateRepository(); }

    public static IRepository TaxRateRepository { get; protected set; }
    public static void SetTaxRateRepository(IRepository rep) {
        TaxRateRepository = rep; }
}

Фабрика является единственным местом, где на класс TaxRateRepository ссылаются непосредственно.

Таким образом, Вам нужны некоторые классы поддержки для этого примера:

class TaxRate {
    public string Region { get; protected set; }
    decimal Rate { get; protected set; }
}

static class Business {
    static decimal GetRate(string region) { 
        var taxRate = RepositoryFactory.TaxRateRepository.Get(region);
        return taxRate.Rate; }
}

И существует также другая другая реализация IRepository - насмешка:

class MockTaxRateRepository : IRepository<TaxRate> {
    public TaxRate ReturnValue { get; set; }
    public bool GetWasCalled { get; protected set; }
    public string KeyParamValue { get; protected set; }
    public TaxRate Get(string key) {
        GetWasCalled = true;
        KeyParamValue = key;
        return ReturnValue; }
}

Поскольку живой код (Бизнес-класс) использует Фабрику для получения Репозитория, в модульном тесте Вы включаете MockRepository для TaxRateRepository. После того как замена сделана, можно трудно кодировать возвращаемое значение и сделать базу данных ненужной.

class MyUnitTestFixture { 
    var rep = new MockTaxRateRepository();

    [FixtureSetup]
    void ConfigureFixture() {
        RepositoryFactory.SetTaxRateRepository(rep); }

    [Test]
    void Test() {
        var region = "NY.NY.Manhattan";
        var rate = 8.5m;
        rep.ReturnValue = new TaxRate { Rate = rate };

        var r = Business.GetRate(region);
        Assert.IsNotNull(r);
        Assert.IsTrue(rep.GetWasCalled);
        Assert.AreEqual(region, rep.KeyParamValue);
        Assert.AreEqual(r.Rate, rate); }
}

Помните, Вы хотите протестировать метод бизнес-логики только, не репозиторий, базу данных, строку подключения, и т.д... Существуют различные тесты для каждого из тех. Путем выполнения его этот путь Вы можете абсолютно изолированный код, который Вы тестируете.

Дополнительная льгота - то, что можно также выполнить модульный тест без соединения с базой данных, которое делает его быстрее, более портативный (думайте команда мультиразработчика в удаленных местоположениях).

Другая дополнительная льгота - то, что можно использовать процесс Разработки через тестирование (TDD) для фазы реализации разработки. Я строго не использую TDD, но соединение TDD и олдскульного кодирования.

60
задан andi 12 June 2009 в 08:29
поделиться

3 ответа

Перенаправление невозможно с запросами POST - это часть протокола HTTP / 1.1 .

Вы можете ввести еще один шаг, содержащий данные формы, которые будут Отправлено в систему обработки платежей, или вы можете отправить сообщение из своего приложения (что я сделал при работе с PROTX).

79
ответ дан 24 November 2019 в 17:47
поделиться

С помощью простой строки javascript вы можете создать свою POST-форму для публикации ( form.submit () ). Затем вы можете скрыть форму и отобразить простое сообщение «подождите, пока ...» для пользователя, пока форма отправляется обработчику платежей.

11
ответ дан 24 November 2019 в 17:47
поделиться

Я «решил» проблему, отобразив сводную страницу со всеми продуктами, стоимостью доставки и т. Д. , с типичным сообщением типа «для подтверждения и оплаты покупок нажмите кнопку« Продолжить »ниже». Нажатие кнопки «Продолжить» заставляет сайт отправлять данные о продукте и все остальное в систему обработки платежей.

Короткий ответ - там еще один шаг для пользователя. Тем не менее, главное - сделать так, чтобы это выглядело как можно более естественным и как можно более важным элементом оформления заказа. Таким образом, это не слишком похоже на «просто еще один шаг».

Однако, если вы сделаете лучший способ, мне будет очень интересно узнать, что это было: )

14
ответ дан 24 November 2019 в 17:47
поделиться
Другие вопросы по тегам:

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