I need to create a few tests for the user roles in a web application. To minimize the description, one of the tests involves checking if a menu entry is displayed or not for an user.
For this test, I use a table called UserRoles, that looks like this:
sUserName bDoesntHaveMenuX
User1 1
User2 0
User3 1
bDoesntHaveMenuX is of type bit.
I have a class derived from ValidationRule that checks if a certain text is present in a page, based on a XPath expression to locate the node where to look for the text.
The public properties of this class are:
string XPathExpression
string Text
bool FailIfFound
The last one dictates if the rule should fail if the text is found or not found.
In the test I added a datasource for the table mentioned in the beginning, called DS.
For the request I’m interested in I added a new instance of my validation rule class, with the following values:
Text=MenuX
XPathExpression=//div[@id='menu']//td
FailIfFound={{DS.UserRoles.bDoesntHaveMenuX}}
Unfortunately, this doesn’t work.
The reason seems to be that the data binding process creates a context variable
DS.UserRoles.bDoesntHaveMenuX has the value “False” or “True”. The value is a string, so the binding results in a casting error.
My options, as far as I can think of, are:
- Change the validation rule to accept strings for FailIfFound. Not a valid
option, for 2 reasons: it’s a hack and the same rule is used in
other places. - Make a new validation rule that will use the above mentioned one,
and implement the FailIfFound as string. I also don’t like this, for
the same reason as above. It’s a hack. - Make the test coded and do the proper cast before passing the data
to the validation rule. I don’t like this one because I prefer to
have the test as coded only if there is no other way.
Which brings me to the question. Is there another way?
Thank you.
So the fundamental issue is that you have no control over how the data-binding treats the ‘bit’ data type, and it’s getting converted to string instead of bool.
The only solution I can think of (which is sadly still a bit of a hack, but not so egregious as changing FailIfFound to string) is to create a WebTestPlugin, and in the PreRequestDataBinding or PreRequest event, convert the value from string to bool. Don’t forget to add the plugin to your test(s) (easy mistake I have made).
Then when the validation rule is created it should pick up the nice new bool value and work correctly.
e.g.
I didn’t actually try this… hope it works.
EDIT: round two… a better solution
This is what I have started doing and it is much more satisfying than having to type ‘True’ or ‘False’ in the property’s edit box.