Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Easieas way to ensure UpdateDatabase call

10 views
Skip to first unread message

Dmitriy Nagirnyak

unread,
Aug 5, 2008, 3:38:48 AM8/5/08
to
Hi,

What is the easies way to ensure UpdateDatabase is called in unit tests?
Better would be to know the objects that are going to be updated.

100% working solution is implementing IPersistenceService and chain the calls
to the original one.
Are there any ideas to implement it with ~<50 lines of code plus <=3 lines
per test?

The aim is 2-3 lines of code per test to ensure object is going to be persisted.
It should not break the IPersistenceService itself (so mocking is tricky).

.NET 3.5

I can buy some beer for an elegant solution or can promise discount at http://www.argocomputing.com.au/Services/DCPortal.aspx

I expect to write the code like this:
[TestMethod]
public void Save_PersistsObject() {
PsAssert<User>()
.Saved()
.With(new { Username="test"} );
// Should save User with Username
Controller.Save(new UserData {
Username= "test"
});
}

:)

Cheers,
Dmitriy.

Peter Morris

unread,
Aug 5, 2008, 8:25:20 AM8/5/08
to
Check there are no dirty objects?

Dmitriy Nagirnyak

unread,
Aug 5, 2008, 9:22:27 AM8/5/08
to
Hello Peter,

> Check there are no dirty objects?
>

<=3 Lines of code per test.

Absence of dirty objects doesn't guaranty objects were persisted. They could
just never beeing created.

This what I've came up for now:
[TestMethod]
public void Save_PersistsDatabase() {
string name = Unique;
Controller.Save(new PersonController.EditData {
FirstName = name
});
var person = WorkSpace.Query<Person>().Where(p=>p.FirstName == name).Single();
Assert.IsTrue(person.IsFullyPersisted());
}

Query is extension method over IEcoServiceProvider that just return IQuaryable.
IsFullyPersisted is extension method over ILoopBack that return true if object
is NOT (New | Dirty | Deleted).

Disadvantage here - using IQuryable which is not performant for ECO (might
run lots of SQL, XPath or just in memory).
But while I don't run tests agains DB I don't care about it. For now.


=========================================================
Looking at this code I've just realised tha it can be simplified:

[TestMethod]
public void Save_PersistsObject() {
var newId = Controller.Save(new PersonController.EditData {
FirstName = Unique
}).Data.As<PersonController.SaveData>().Id;
var person = WorkSpace.GetObject<Person>(newId);
Assert.IsNotNull(person);
Assert.IsTrue(person.IsFullyPersisted(), "Not saved.");
}


It only relies on IsFullePersisted (StateService.IsNew,IsDirty, IObject.Deleted).

==========================================================


It is not what I wanted but works for now very good.
It seems my initial idea were to record what should happen with ECO objects
and then verify it.
It'd involve stages like:
1. Record actions and conditions.
2. Save current ECO state.
3. Exercise.
4. Save current ECO state.
5. Compare 2 and 4 and veryfy conditions.

Looks like common implementation of Mocking Frameworks.
Not sure I really need it.


Peter Morris

unread,
Aug 6, 2008, 6:35:23 AM8/6/08
to
What I do is to always use the IEcoServiceProvider to obtain all service
references. The I use Rhino Mocks to register a mock IPersistenceService
and add an Expect.Call for UpdateDatabaseWithList


Pete

Dmitriy Nagirnyak

unread,
Aug 6, 2008, 8:13:36 AM8/6/08
to
Hello Peter,

> Expect.Call for UpdateDatabaseWithList
>

How do you know what exactly has been saved?


Peter Morris

unread,
Aug 7, 2008, 6:27:47 AM8/7/08
to
If you need to do that I would instead write a passthough class which has an
INT property on it and throws an exception if the number of objects being
saved is incorrect.


Pete

0 new messages