Вы должны поместить свой код 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
На самом деле NodesBeforeSelf ().Count не работает, потому что это получает все даже типа XText
Вопрос был об объекте XElement. Таким образом, я полагал, что это
int position = obj.ElementsBeforeSelf().Count();
это должно использоваться,
Благодаря Bryant для направления.
Вы могли использовать метод 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. Положение ().:)
static int Position(this XNode node) {
var position = 0;
foreach(var n in node.Parent.Nodes()) {
if(n == node) {
return position;
}
position++;
}
return -1;
}
На самом деле в методе Загрузки XDocument можно установить опцию загрузки SetLineInfo, можно затем преобразовать тип XElements к IXMLLineInfo для получения номера строки.
Вы могли сделать что-то как
var list = from xe in xmldoc.Descendants("SomeElem")
let info = (IXmlLineInfo)xe
select new
{
LineNum = info.LineNumber,
Element = xe
}