2 Stimmen

TDD und MVC 3, Testen von Modellen

Ich versuche zu lernen, wie man Unit-Test und Arbeit mit MVC 3 und ich bin immer auf das Problem der Wie teste ich zwei Modelle stecken. Hier ist der Code

public class HomeController : Controller
{
    private IRepository _repository;

    public  HomeController(IRepository repository)
    {
        _repository = repository;
    }

    //
    // GET: /Home/

    public ActionResult Index()
    {
        return View(_repository.GetAllGenres());
    }    
}

public interface IRepository
{
    IEnumerable<Genre> GetAllGenres();
    IEnumerable<Album> GetTopAlbums(int count);
}

und nehme an, dass dies mein Unit Testing ist

[TestFixture]
class HomeControllerTests
{
    [Test]
    public  void Test1()
    {                
        //Arrange
        var controller = new HomeController(new InMemoryRepository());
        var result = (ViewResult) controller.Index();

        Assert.AreEqual(10,((IEnumerable<Genre>)result.ViewData.Model).Count());
    }

    [Test]
    public  void Test2()
    {
        var controller = new HomeController(new InMemoryRepository());
        var result = (ViewResult) controller.Index();
        //I Want to be able to do something like this
        Assert.AreEqual(5,result.ViewData.Model.GetTopAlbums(5).Count);
    }
}

Meine Frage ist nun: Wie genau muss ich vorgehen, damit so etwas funktioniert, wie ich es mir wünsche? Oder erstelle ich eine ChildActionOnly-Methode, die für die Rückgabe der Top-Alben verantwortlich ist.

2voto

Jesse Punkte 7963

Haben Sie in Erwägung gezogen, ein Mocking-Framework zu verwenden, um Sie bei Ihren Tests zu unterstützen? Zum Beispiel könnten Sie mock auf Ihrem GetTopAlbums Aufruf verwenden. Meine Präferenz ist moq aber es gibt mehrere großartige Mocking-Frameworks, aus denen man wählen kann.

Beachten Sie, dass dies ein ziemlich einfaches Beispiel ist, aber Sie könnten leicht eine Testhilfe erstellen, um eine Liste mit der von Ihnen erwarteten Anzahl von Alben zu erzeugen:

[Test]
public void Index_Get_Should_Lookup_Top_Albums_And_Return_Index_View()
{
    // arrange
    var expectModel = new List<Album>
                            {
                                new Album{Artist= "joe", Tracks = 16},
                                new Album{Artist= "doe", Tracks = 23},
                            };

    _repository.Setup(x => x.GetTopContacts(It.IsAny<int>())).Returns(expectModel);

    var controller = new HomeController(_repository.Object);

    // act
    var result = controller.TopContacts();
    var model = result.ViewData.Model as IEnumerable<Album>;

    // assert
    Assert.AreEqual(2, model.Count());
}

0voto

tugberk Punkte 55751

Ich habe eine sehr gute Lösung für Sie. Siehe die beiden folgenden Blogbeiträge:

Generisches Repository-Muster - Entity Framework, ASP.NET MVC und Unit Test-Dreieck

Wie man mit generischen Repositories auf ASP.NET MVC und Unit Testing arbeitet Sie durch Mocking

Im Grunde ist es das, was @Jesse bereits vorgeschlagen hat, aber diese beiden Beiträge haben auch einige andere Funktionen, die für Sie hilfreich sein könnten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X