Вероятно, самое простое, что нужно сделать, - это искать контент, который должен быть на незащищенной странице, а не на защищенной странице. Найдя ожидаемый контент, проверьте URL, чтобы убедиться, что вы находитесь там.
it('should not allow regular user access', test => {
return test.remote
.then(e2e.impersonate('test@test.com'))
.get('/protected-route')
.findByCssSelector('.something.that.should.be.visible')
.getCurrentUrl()
.then(url => {
console.log('url', url);
expect(url.indexOf('/landing-page')).not.toBe(-1);
return true;
});
});
Проблема находится в Вашем обзоре, не в Ваших закрытиях. Если Вы подлежите некоторому тяжелому чтению, то можно попробовать http://www.python.org/dev/peps/pep-3104/.
Если это не так вот простое объяснение:
Проблема находится в операторе global get
. global
относится к наиболее удаленному объему, и так как нет никакой глобальной функции get
, это бросает.
То, в чем Вы нуждаетесь, является спецификатором доступа для переменных в объеме включения а не глобальной областью видимости.
В python 3.0, поскольку я протестировал, nonlocal
ключевое слово точно, вместо чего Вы нуждаетесь, global
.
nonlocal get
...
В Python 2.x, я просто удалил global get
и oldget
ссылки и это работают правильно.
def memoize(fn):
get = [lambda key: (False, None)]
def vset(args):
value = fn(*args)
oldget = get[0]
def newget(key):
if args == key:
return (True, value)
return oldget(key)
get[0] = newget
return value
def mfun(*args):
found, value = get[0](args)
if found:
return value
return vset(args)
return mfun
CALLS = 0
def fib(x):
global CALLS
CALLS += 1
if x<2: return x
return fib(x-1)+fib(x-2)
@memoize
def fibm(x):
global CALLS
CALLS += 1
if x<2: return x
return fibm(x-1)+fibm(x-2)
CALLS = 0
print "fib(35) is", fib(35), "and took", CALLS, "calls"
CALLS = 0
print "fibm(35) is", fibm(35), "and took", CALLS, "calls"
Вывод:
fib(35) is 9227465 and took 29860703 calls
fibm(35) is 9227465 and took 36 calls
Подобный другим ответам, однако эти работы.:)
Важное изменение из кода в вопросе присваивает неглобальному нелокальному (добираются); однако, я также сделал некоторые улучшения при попытке поддержать Ваш *
кашель*
поврежденный*
кашель*
использование закрытия. Обычно кэш является dict вместо связанного списка закрытий.
Вы хотите поместить global get
в начале каждой функции (кроме get
самостоятельно).
def get
присвоение на имя get
, таким образом, Вы хотите, добираются, чтобы быть объявленным глобальным перед этим.
Помещение global get
в mfun и vset заставляет их работать. Я не могу указать на правила обзора данных, который делает это необходимым, но это работает ;-)
Ваши conses вполне lispy также... :)
Get
не глобально, но локален для окружающей функции, вот почему global
сбои объявления.
Если Вы удаляете global
, это все еще перестало работать, потому что Вы не можете присвоить полученному имени переменной. Для работы, вокруг которого, можно использовать объект в качестве переменной, полученной закрытиями и, чем просто свойства изменения того объекта:
class Memo(object):
pass
def memoize(fn):
def defaultget(key):
return (False,)
memo = Memo()
memo.get = defaultget
def vset(key, value):
oldget = memo.get
def newget(ky):
if key==ky: return (True, value)
return oldget(ky)
memo.get = newget
def mfun(*args):
cache = memo.get(args)
if cache[0]: return cache[1]
val = apply(fn, args)
vset(args, val)
return val
return mfun
Таким образом, Вы не должны присвоить полученным именам переменной, но все еще получить то, что Вы хотели.
Вероятно, потому что Вы хотите глобальное, добираются, в то время как это не глобальное? Между прочим, подайте заявку, удерживается от использования, используйте fn (*args) вместо этого.
def memoize(fn):
def get(key):
return (False,)
def vset(key, value):
def newget(ky):
if key==ky: return (True, value)
return get(ky)
get = newget
def mfun(*args):
cache = get(args)
if (cache[0]): return cache[1]
val = fn(*args)
vset(args, val)
return val
return mfun
def fib(x):
if x<2: return x
return fib(x-1)+fib(x-2)
def fibm(x):
if x<2: return x
return fibm(x-1)+fibm(x-2)
fibm = memoize(fibm)
Я думаю, что лучший способ:
class Memoized(object):
def __init__(self,func):
self.cache = {}
self.func = func
def __call__(self,*args):
if args in self.cache: return cache[args]
else:
self.cache[args] = self.func(*args)
return self.cache[args]