Pessoal,
Recentemente descobri (não sei se vocês já conheciam) uma ferramenta bem interessante, que tem ajudado bastante na criação de stub‘s para os testes de unidade. Trata-se do NBuilder (http://nbuilder.org).
O NBuilder é um projeto open source, que permite criar objetos a partir das suas classes muito rapidamente, através de uma interface fluente e extensível. Ele instancia os objetos e atribui automaticamente valores às propriedades e campos públicos da sua classe, além de permitir que você substitua os valores das propriedades dos objetos criados usando expressões lambda.
Bom, como sempre, vamos aos exemplos práticos que sempre são mais elucidativos que a teoria. Acredito que rapidamente vocês vão entender a “mão na roda” que essa ferramenta é. Para que você possa reproduzir esses exemplos, basta fazer o download do NBuilder e referenciá-lo no seu projeto.
Tomando como exemplo esse domínio:
public class Blog : IBusinessEntity { public int Id { get; set; } public string Name { get; set; } public IList Posts { get; set; } } public class Post : IBusinessEntity { public int Id { get; set; } public string Title { get; set; } public string Text { get; set; } public string Author { get; set; } }
Criei alguns testes de unidade para exemplificar a utilização do NBuilder:
[TestMethod] public void Build_Blog() { // Arrange // Act var blog = Builder<Blog>.CreateNew().Build(); // Assert Assert.IsNotNull(blog); Assert.AreEqual(1, blog.Id); Assert.AreEqual("Name1", blog.Name); }
Perceberam o que o método Builder<Blog>.CreateNew() fez? Ele instanciou um objeto do tipo Blog e preencheu as propriedades Id e Name apropriadamente, e o método Build() nos retornou o objeto. Simples demais.
Podemos também criar listas de objetos muito facilmente:
[TestMethod] public void Build_ListOfPosts() { // Arrange // Act var posts = Builder<Post>.CreateListOfSize(10).Build(); // Assert Assert.AreEqual(10, posts.Count); Assert.AreEqual(1, posts.First().Id); Assert.AreEqual(10, posts.Last().Id); Assert.AreEqual("Title1", posts.First().Title); Assert.AreEqual("Title10", posts.Last().Title); Assert.AreEqual("Text1", posts.First().Text); Assert.AreEqual("Text10", posts.Last().Text); Assert.AreEqual("Author1", posts.First().Author); Assert.AreEqual("Author10", posts.Last().Author); }
Muito legal. O método Builder<Post>.CreateListOfSize(int) instanciou 10 objetos do tipo Post, preencheu as propriedades apropriadamente e os retornou em um IList<Post>:
- A propriedade Id (do tipo int), recebeu os valores 1, 2, …, 10;
- A propriedade Title (do tipo string), recebeu os valores “Title1”, “Title2”, …, “Title10”;
- A propriedade Author (do tipo string), recebeu os valores “Author1”, “Author2”, …, “Author10”.
- Etc…
No primeiro exemplo, a propriedade Posts (que é um IList<Post>) do objeto Blog não foi preenchida. Para que essa propriedade seja preenchida, precisamos usar o método With:
[TestMethod] public void Build_ListOfBlogsWithPosts() { // Arrange var posts = Builder<Post>.CreateListOfSize(10).Build(); // Act var blog = Builder<Blog>.CreateNew() .With(b => b.Posts = posts).Build(); // Assert Assert.IsNotNull(blog); Assert.AreEqual(10, blog.Posts.Count); Assert.AreEqual(1, blog.Posts.First().Id); Assert.AreEqual(10, blog.Posts.Last().Id); Assert.AreEqual("Title1", blog.Posts.First().Title); Assert.AreEqual("Title10", blog.Posts.Last().Title); }
Esses são exemplos bem simples, mas nos dá uma idéia do que podemos fazer com a ferramenta. Temos vários outros métodos, que nos permite:
- Definir valores para várias propriedades;
- Definir valores para construtores;
- Executar métodos da classe após instanciá-la;
- Setar propriedades para todos os itens de um IList;
- Obter itens randomicamente de listas;
- Navegar pelos itens de listas;
- Definir valores para propriedades do tipo DateTime com uma sintaxe fluente bem legal.
Bem, isso foi só uma amostra do que é possível fazer com o NBuilder, vale muito a pena dar uma olhada.
Em um próximo post vou mostrar algumas “coisas” um pouco mais complexas que já fiz com ele, além de mostrar como o tenho utilizado juntamente com o Moq (http://code.google.com/p/moq), para criação de stub‘s nos testes de unidade.
Forte abraço.
Deixe um comentário