Building Data-Driven Web Apps with Flask and SQLAlchemy Transcripts
Chapter: Testing web apps
Lecture: Testing view methods
Login or
purchase this course
to watch this video and the rest of the course contents.
0:00
Now it's time to move one level up in our testing.
0:03
What have we tested so far?
0:04
We've tested that part right there.
0:07
However, I would like to test
0:09
that if we go to this registration process successfully
0:12
we get redirected back to the account page
0:17
and if not, maybe we stay in the same place
0:19
something to that effect.
0:20
What we're going to do is we're going to import this function
0:23
and call it.
0:24
Now you'll see there's a couple of other things
0:26
that are going to be happening
0:27
so here when we have create_user
0:29
we're going to have to make sure
0:31
that actually get called in the same way.
0:34
So, let's get started on that
0:37
and I'm just going to duplicate a little bit of this here.
0:43
Test registration view new user.
0:49
Something to that effect, okay?
0:51
So, we're going to come down here
0:52
and we're going to say from pypi_org.views
0:57
account_views import register_post
1:01
and our goal is going to be just
1:03
to simply call that function.
1:05
So, I'm not doing this here
1:08
We're still passing in this data
1:10
but we're just going to try to call that function.
1:12
If we look, it doesn't take any arguments
1:14
it may, sometimes it does
1:16
like in the case of our package here.
1:20
We might have to pass that
1:21
but in this case we're just calling this one.
1:23
It doesn't take any argument.
1:25
Everything is passed through the form.
1:28
So, theoretically we have our data all set up
1:30
to pass the validation.
1:32
We already have to say hey, unittest
1:34
what we're going to do is we're going to return none
1:38
for the user here
1:40
and we don't need to do validate
1:41
but we do need to do this up here like so.
1:47
We need to say hey
1:48
when we do this test here
1:50
we would like to make sure
1:51
and before we call this function
1:53
we want to make sure that if that function happens
1:55
to have all find user by email
1:57
it's going to return none.
1:58
We also need to do another one here.
2:01
Now this is going to look a little messy
2:02
we should be able to clean it up in a sec.
2:04
User service, what is the other user service
2:06
function we're calling?
2:08
Create user, so if we're calling create user
2:13
we want to have it return an object.
2:16
Now if you look over here
2:17
it says if it doesn't get back a user
2:20
there's some kind of problem
2:21
so we need to make sure that we get back a user here as well
2:25
for this particular one, okay?
2:28
So, that's a lot of with blocks here.
2:30
Maybe we can clean it up.
2:31
We'll see but we're going to do our post
2:33
this will be are our act here.
2:37
I want to get a response
2:38
and this is going to be a response object.
2:41
It'll help us work with it.
2:43
If we come down here
2:45
and we import flask response here
2:47
and we're going to assert some stuff about it
2:49
so we could go here and say that the location is /account
2:56
so I feel like that's probably what we're looking for
2:59
when we're coming down here
3:01
we've gone and we've gone and done this.
3:04
We've redirected over to there
3:05
so that redirect action
3:06
is to set a location header to be /account.
3:10
Whoa, all right, let's see if this is going to work.
3:12
We can try our test again.
3:17
It looked like it works, beautiful.
3:19
Let's just verify that it does.
3:23
So, we can come over here
3:24
if this part failed, we would see of course
3:26
it comes back and says do we get this error?
3:31
No, the expected was /account
3:38
but what we actually got is something down here
3:42
the left was none, we expected this to be /account.
3:46
The reason it's not is it's actually an HTML response
3:48
not a redirect response.
3:50
Cool, so that worked over here.
3:54
And of course if the user can't be found again
3:58
we get some kind of thing
4:00
where it's showing that hey, the user couldn't be created
4:03
as an error.
4:07
Super, now I had this nesting and nesting and nesting
4:10
and with blocks.
4:12
I'm not a big fan, so let's go do this.
4:16
So, we'll say and do
4:20
a quick little organization here like that.
4:27
Move this one up
4:30
and so, we can create user.
4:33
Let's just call this find user
4:35
and then this will be the request.
4:41
And then we can do a much simpler version
4:43
of find user, rate user request.
4:48
So, deindent that so it's not so terrible.
4:52
Is that better? Oh, you decide here.
4:55
It's just kind of messy
4:56
and sometimes that's just how it goes
4:58
but let's just see that it still works.
5:00
Yeah, it still works like a charm.
5:02
So, we can at least not go super indented here
5:05
by creating all those things
5:06
and then usually in a single context block for all them.
5:10
So, that's how we test these view methods
5:12
and we've already verified that that part works
5:15
so we don't have to write too many of them.
5:16
We probably want to check that we do get
5:18
the right error message back here
5:21
and here in those two cases
5:23
and then in this case we're already testing
5:24
that we get this redirect. Beautiful.