I've created unit test for the "student" CRUD operations that looks like this:
[Test]
public void Can_Exec_CrudOps()
{
#region Prepare
var account = Processor.Execute(new CreateAccount
{
Email = "[email protected]",
Username = "username",
Password = "password",
}).Result;
#endregion
var student = Processor.Execute(new CreateStudent
{
AccountId = account.EntityID
}).Result;
Assert.NotNull(student);
student.AreEqual(Processor.Execute(new GetStudent
{
EntityId = student.EntityID
}).Result);
student.AreEqual(Processor.Execute(new GetStudentByAccount
{
AccountId = account.EntityID
}).Result);
var upd_student = Processor.Execute(new UpdateStudent
{
EntityId = student.EntityID,
Flags = StudentFlags.Active
}).Result;
Assert.NotNull(upd_student);
upd_student.AreEqual(student);
upd_student.Flags.AreEqual(StudentFlags.Active);
Processor.Execute(new DeleteStudent
{
EntityId = student.EntityID
});
}
As you can see, the region #prepare contains code that will insert required data to the database for the current test to be possible.
Is it good practice to create a single test for each CRUD operation and then call that test inside the tests that require them?
What I'm thinking about would look like this:
[TestFixture]
public class StudentTest : OperationTest
{
protected override IEnumerable<Type> ModelMappings
{
get
{
return NHMappings.EDUCATION;
}
}
[Test]
public void Can_Exec_CrudOps()
{
#region Prepare
// here is what changed //
var acc = new AccountTests();
var acc_id= acc.create_account();
#endregion
var student = Processor.Execute(new CreateStudent
{
//here too//
AccountId = acc_id
}).Result;
Assert.NotNull(student);
student.AreEqual(Processor.Execute(new GetStudent
{
EntityId = student.EntityID
}).Result);
student.AreEqual(Processor.Execute(new GetStudentByAccount
{
// and here//
AccountId = acc_id
}).Result);
var upd_student = Processor.Execute(new UpdateStudent
{
EntityId = student.EntityID,
Flags = StudentFlags.Active
}).Result;
Assert.NotNull(upd_student);
upd_student.AreEqual(student);
upd_student.Flags.AreEqual(StudentFlags.Active);
Processor.Execute(new DeleteStudent
{
EntityId = student.EntityID
});
// and here //
acc.deleteaccount(acc_id);
}
}
So the point is not to write the same code over and over again.