Как получить положение () XElement?

Вы должны поместить свой код expect(ChangeEmitter).to receive(:new) над почтовым запросом. Когда вы ожидаете, что класс получит метод, ваша инструкция «ожидаем» перед вызовом контроллера. Ожидается, что что-то случится в будущем. Таким образом, ваш тест должен выглядеть примерно так:

it "calls the emitter" do    
  user_params = FactoryGirl.attributes_for(:user)

  expect(ChangeEmitter).to receive(:new)

  post :create, user: user_params

  expect(response.status).to eq(200)
end

РЕДАКТИРОВАТЬ

Заметив, что вы цепляете действие «испустить» после вызова «нового», я понял, что я необходимо обновить мой ответ для вашего конкретного случая использования. Вам нужно вернуть объект (я обычно возвращаю шпиона или двойника), который может вызвать emit. Для получения дополнительной информации о разнице между шпионами и двойниками смотрите: https://www.ombulabs.com/blog/rspec/ruby/spy-vs-double-vs-instance-double.html [116 ]

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

Итак, вы хотите сделать это так:

it "calls the emitter" do    

  user_params = FactoryGirl.attributes_for(:user)

  emitter = spy(ChangeEmitter)
  expect(ChangeEmitter).to receive(:new).and_return(emitter)

  post :create, user: user_params

  expect(response.status).to eq(200)
end

7
задан John Sheehan 17 October 2008 в 06:08
поделиться

4 ответа

На самом деле NodesBeforeSelf ().Count не работает, потому что это получает все даже типа XText

Вопрос был об объекте XElement. Таким образом, я полагал, что это

int position = obj.ElementsBeforeSelf().Count();

это должно использоваться,

Благодаря Bryant для направления.

10
ответ дан 6 December 2019 в 14:11
поделиться

Вы могли использовать метод NodesBeforeSelf, чтобы сделать это:

    XElement root = new XElement("root",
        new XElement("one", 
            new XElement("oneA"),
            new XElement("oneB")
        ),
        new XElement("two"),
        new XElement("three")
    );

    foreach (XElement x in root.Elements())
    {
        Console.WriteLine(x.Name);
        Console.WriteLine(x.NodesBeforeSelf().Count()); 
    }

Обновление: Если Вы действительно просто хотите метод Положения, просто добавьте дополнительный метод.

public static class ExMethods
{
    public static int Position(this XNode node)
    {
        return node.NodesBeforeSelf().Count();  
    }
}

Теперь можно просто назвать x. Положение ().:)

5
ответ дан 6 December 2019 в 14:11
поделиться
static int Position(this XNode node) {
  var position = 0;
  foreach(var n in node.Parent.Nodes()) {
    if(n == node) {
      return position;
    }
    position++;
  }
  return -1;
}
0
ответ дан 6 December 2019 в 14:11
поделиться

На самом деле в методе Загрузки XDocument можно установить опцию загрузки SetLineInfo, можно затем преобразовать тип XElements к IXMLLineInfo для получения номера строки.

Вы могли сделать что-то как

var list = from xe in xmldoc.Descendants("SomeElem")
           let info = (IXmlLineInfo)xe
           select new 
           {
              LineNum = info.LineNumber,
              Element = xe
           }
0
ответ дан 6 December 2019 в 14:11
поделиться
Другие вопросы по тегам:

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