2009-12-03 5 views
0

Accueillez toute aide.Comment implémenter et tester ASP.NET MVC FakeRepository

Je suis en train d'apprendre à écrire du code en utilisant le framework ASP.NET MVC, je l'ai en quelque sorte vendu sur ce concept. En ce moment, ma principale pierre d'achoppement est de savoir comment installer et tester un référentiel qui remplace la base de données. Pour tester l'application MVC, j'ai créé une classe et l'ai appelée fakerepository.cs Cette classe implémente des méthodes à partir de l'interface IContactManagerRepository.

namespace MyTestMVCProject.Models 
{ 
    public class FakeContactManagerRepository : IContactManagerRepository 
    { 
     IList<Contact> _contacts = new List<Contact>(); 

     #region IContactManagerRepository Members 

     public Contact Create(Contact contact) 
     { 
      _contacts.Add(contact); 
      return contact; 
     } 

     public Contact Edit(Contact contact) 
     { 
      throw new NotImplementedException(); 
     } 

     public void Delete(int id) 
     { 
      throw new NotImplementedException(); 
     } 

     public IList<Contact> ListContacts() 
     { 
      return _contacts; 
     } 

     #endregion 
    } 
} 

Dans la tentative de test ci-dessous, je souhaite m'assurer que le contact a été créé et que la valeur d'ID est correcte.

[Test] 
public void Test_02_ContactController_Passes_ViewData_To_Details_View() 
{ 
    // Arrange 
    ContactController _controller = new ContactController(); 

    // Act 
    var _contact = new Contact 
    { 
     Id = 1, 
     FirstName = "Donald", 
     LastName = "Duck" 
    }; 

    var _result = _controller.Create(_contact) as ViewResult; 
    var contact = _result.ViewData.Model as Contact; 

    // Assert 
    Assert.AreEqual(1, _contact.Id); 
} 

Malheureusement, le test échoue toujours.

Bien sûr, je suis très novice en matière de test, mais j'ai beaucoup appris en peu de temps en effectuant des recherches sur google et en regardant des vidéos ASP.NET MVC.

Quelqu'un peut-il suggérer comment je peux tester un fakerepository qui renvoie une liste à ViewResult?

Répondre

2

test pourrait ressembler à:

[Test] 
public void PostingValidContactCreatesOneInRepositoryAndReturnsViewResult() 
{ 
    // Arrange 
    var controller = new ContactController(new FakeContactManagerRepository()); 

    // Act 
    var contact = new Contact 
    { 
     Id = 1, 
     FirstName = "Donald", 
     LastName = "Duck" 
    }; 

    var result = controller.Create(contact); 

    //Assert there is one created Contact in repository 
    Assert.AreEqual(1, Repository.ListContacts().Count()); 
    //Check if result is ViewResult 
    Assert.IsInstanceOfType(result,typeof(ViewResult)); 
    //Assert item Id is 1 
    Assert.AreEqual(1, Repository.ListContacts().First().ID); 
    //Check if posting valid contact doesn't invalidate model state 
    Assert.IsTrue(controller.ModelState.IsValid); 
} 

ContactController doit prendre IContactManagerRepository dans le constructeur

public ContactController(IContactManagerRepository repository); 

Dans les tests que vous fournissez avec FakeContactManagerRepository, en utilisation réelle, vous pouvez injecter votre dépôt réel.

EDIT

Vos erreurs sont:

var contact = _result.ViewData.Model as Contact; 

Contact Posté est pas _result.ViewData.Model, mais dans le paramètre de fonction Créer.

var _result = _controller.Create(_contact) as ViewResult; 

Ce n'est pas une erreur, mais vous pouvez définir comme

var _result = _controller.Create(_contact) 

et vérifier si le résultat est de type correct.

Assert.AreEqual(1, _contact.Id); 

Cela n'a aucun sens, vous avez affecté _contact.Id quelques lignes plus tôt. Vous devriez prendre contact avec le dépôt et vérifier.

Questions connexes