Да.
Извинения за то, что были прерваны (я должен на самом деле сделать некоторую работу время от времени). Спецификация не делает явно , говорит она, но она делает это довольно ясным IMO в разделе 7.6.10.2:
<час>объектный инициализатор состоит из последовательности членских инициализаторов, включенных {и} маркеры и разделенный запятыми.
(Отмечают слово "последовательность" здесь, вместо того, чтобы "установить". Я лично думаю, что это значительно, поскольку последовательность заказана.)
следующий класс представляет точку с двумя координатами:
public class Point
{
int x, y;
public int X { get { return x; } set { x = value; } }
public int Y { get { return y; } set { y = value; } }
}
экземпляр Точки может быть создан и инициализирован следующим образом:
Point a = new Point { X = 0, Y = 1 };
, который имеет тот же эффект как [1 117]
Point __a = new Point();
__a.X = 0;
__a.Y = 1;
Point a = __a;
где __ в других отношениях невидимой и недоступной временной переменной.
<час>РЕДАКТИРОВАНИЕ: у меня был ответ от Mads Torgersen, который в основном сказал, что что-либо, что может быть сделано теперь, сохранит порядок. Могут быть некоторые причуды в будущем, где порядок не сохраняется в странных случаях, где Вы делаете что-то другой , чем установка свойства/поля, но это будет зависеть от того, куда язык идет.
стоит указать, что существует на самом деле много шагов, продолжающихся здесь - существует порядок выполнения оценки аргументов (т.е. биты RHS) и порядок выполнения присвоений. Например, если Вы имеете:
new Foo
{
A = X,
B = Y
}
все выполняющие приказы возможны, все еще поддерживая порядок фактического выполнения свойства (A и B):
, я полагаю, что первая опция является той, на самом деле взятой, но это должно было только продемонстрировать, что существует больше к нему, чем кажется на первый взгляд.
я также был бы очень опасающийся на самом деле написания кода, которое зависит от этого...
Наконец-то я нашел проблему, хотя ее решение довольно хакерское.
Один плагин полагается, что в базе данных есть некоторые данные, по крайней мере, одна строка. Итак, что произошло:
Хакерское решение: поместите необходимые данные прямо в схему, а не в фикстуры, потому что они загружаются слишком поздно.
Я буду искать более удобное решение и обновлю этот ответ, если найду его.
Поместите вызов fixtures: all
в вашем тестовом классе, а не в суперкласс (test_helper). Я предполагаю, что инициализация суперкласса работает не так, как вы ожидаете, и что fixtures: all
не вызывается. Возможно, попробуйте поместить вызов в метод инициализации test_helper.
Мой test / test_helper.rb
выглядит так:
ENV['RAILS_ENV'] ||= 'test'
require File.expand_path('../../config/environment', __FILE__)
require 'rails/test_help'
class ActiveSupport::TestCase
# Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order.
fixtures :all
# Add more helper methods to be used by all tests here...
end
Не уверен, что вы это уже сделали, но экспортируйте тестовые данные из базы данных в файлы yml в test / fixtures с помощью плагина вроде ar_fixtures
Другой подход - написать свою собственную задачу для тестирования.
Например:
task :test_units do
RAILS_ENV = 'test' # Force the environment to test
puts "Recreate the test database"
Rake::Task['db:test:prepare'].invoke
puts "Seed the database with fixtures"
Rake::Task['db:fixtures:load'].invoke
puts "Executing Unit Tests"
Rake::Task['test:units'].prerequisites.clear
Rake::Task['test:units'].invoke
end