# Wrapping tests involving eval in @testset

**URL:** https://discourse.julialang.org/t/wrapping-tests-involving-eval-in-testset/35257
**Category:** Statistics
**Created:** [February 27, 2020, 8:48pm UTC](https://discourse.julialang.org/t/wrapping-tests-involving-eval-in-testset/35257 "2020-02-27T20:48:38Z")
**Posts on this page:** 3
**Page:** 1

<div class="post-metadata">

### Author: ![ablaom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ablaom/32/4889_2.png) [@ablaom](https://discourse.julialang.org/u/ablaom)
#### Post date: [February 27, 2020, 8:48pm UTC](https://discourse.julialang.org/t/wrapping-tests-involving-eval-in-testset/35257/1 "2020-02-27T20:48:38Z")

</div>

I often get into trouble wrapping unit tests involving macros or eval in `@testset`. Can someone explain why the first example works but the second fails?

```julia
    x = 5
    eval(quote
         @test x == 5
         end
         )

```

```julia
@testset "tests" begin
    y = 5
    eval(quote
         @test y == 5
         end
         )
end

tests: Error During Test at REPL[552]:4
  Test threw exception
  Expression: y == 5
  UndefVarError: y not defined
  Stacktrace:
   [1] top-level scope at REPL[552]:4
   [2] eval at ./boot.jl:319 [inlined]
   [3] eval(::Expr) at ./client.jl:393
   [4] macro expansion at ./REPL[552]:3 [inlined]
   [5] macro expansion at /Users/julia/buildbot/worker/package_macos64/build/usr/share/julia/stdlib/v1.0/Test/src/Test.jl:1083 [inlined]
   [6] top-level scope at ./REPL[552]:2

```

Running on julia 1.0.5

---

<div class="post-metadata">

### Author: ![pixel27](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/pixel27/32/8902_2.png) [@pixel27](https://discourse.julialang.org/u/pixel27)
#### Post date: [February 28, 2020, 12:44pm UTC](https://discourse.julialang.org/t/wrapping-tests-involving-eval-in-testset/35257/2 "2020-02-28T12:44:15Z")

</div>

`eval()` evaluates the expression in the global scope. In your first example you defined `x` as global. In the second `y` is local to the testset.

[https://docs.julialang.org/en/v1/base/base/#Base.MainInclude.eval](https://docs.julialang.org/en/v1/base/base/#Base.MainInclude.eval)

If you changed it to:

```julia
@testset "tests" begin
    global y = 5
    eval(quote
         @test y == 5
         end
         )
end

```

It will work, but I’m not sure that is what you want.

---

<div class="post-metadata">

### Author: ![ablaom](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/ablaom/32/4889_2.png) [@ablaom](https://discourse.julialang.org/u/ablaom)
#### Post date: [March 6, 2020, 12:12am UTC](https://discourse.julialang.org/t/wrapping-tests-involving-eval-in-testset/35257/3 "2020-03-06T00:12:45Z")

</div>

That clears up my confusion. Many thanks.
