2010-03-03 6 views
3

Je suis nouveau à des tests unitaires et je voulais donner NUnit essayer.Comment puis-je utiliser NUnit avec un site Web ASP.NET (et non un projet Web)?

Dans un projet Web ASP.NET, je peux créer un nouveau projet dans ma solution de projet Web pour les tests unitaires et ajouter une référence à mon projet d'origine et dans NUnit je peux charger le fichier dll pour mon projet de test unitaire les tests.

Cependant, je développe un site Web ASP.NET et parce qu'un site Web ASP.NET n'a pas un fichier dll, je ne peux pas ajouter un projet distinct dans ma solution qui fait référence à mon projet de site Web, et par conséquent, je n'étais pas capable d'accéder aux classes du projet principal à tester. Même si je décide de quitter mes tests dans mon principal projet de site Web, je ne suis pas en mesure de charger directement le dll pour le site Web dans le NUnit Gui (parce qu'il n'y a pas de fichier dll).

Je également face à un problème lorsque je tente de creat tests unitaires pour mon site Web en utilisant Visual Studio, ne savent pas si elles sont liées.

Toute aide serait aprécié.

Répondre

4

Pourquoi ne pouvez-vous passer à projet d'application Web à la place? Vous pouvez également déplacer votre logique métier vers un projet de bibliothèque de classes externe, puis référencer ce dernier dans votre projet de test Nunit.

+0

Alors un test unitaire des sites Web ASP.NET n'est pas possible? – bahith

+0

Cela peut être possible avec la version publiée du site Web. De cette façon, vous avez une DLL avec laquelle vous pouvez vous lier dans le projet de test Nunit. Cependant, c'est une solution plutôt délicate. J'ai en fait des impressions négatives sur les projets du site Web du tout. – Kerido

+0

Merci beaucoup. – bahith

-1

Vous pouvez fournir la référence à votre projet de site par

ajouter référence-> projets-> Ajouter un projet.

+0

vous ne pouvez pas ajouter de référence à un site Web – Steve

2

Oui, il est possible. L'astuce consiste à ne pas utiliser le NUnit GUI Runner, mais avoir une page de test ASP.net personnalisée. Voici un exemple utilisant Razor. Ce qui suit va dans App_Code \ MyRunner.cs:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using NUnit.Core; 
using NUnit.Framework; 
using NUnit.Core.Extensibility; 

/// <summary> 
/// Summary description for TestRunner 
/// </summary> 
public class MyRunner 
{ 
    public static IList<TestResult> Run(Type testCase) 
    { 
     NUnit.Core.CoreExtensions.Host.InitializeService(); 
     TestExecutionContext.CurrentContext.TestPackage = new TestPackage(testCase.FullName); 
     MyListener listener = new MyListener(); 
     if (TestFixtureBuilder.CanBuildFrom(testCase)) 
     { 
      NUnit.Core.Test test = TestFixtureBuilder.BuildFrom(testCase); 
      test.Run(listener, NUnit.Core.TestFilter.Empty); 
     } 
     return listener.Results; 
    } 
} 

public class MyListener : EventListener 
{ 

    public IList<TestResult> Results { get { return _results; } } 

    public void RunFinished(Exception exception) 
    { 

    } 

    public void RunFinished(TestResult result) 
    { 

    } 

    public void RunStarted(string name, int testCount) 
    { 

    } 

    public void SuiteFinished(TestResult result) 
    { 
    } 

    public void SuiteStarted(TestName testName) 
    { 

    } 

    IList<TestResult> _results = new List<TestResult>(); 
    public void TestFinished(TestResult result) 
    { 
     _results.Add(result); 
    } 

    public void TestOutput(TestOutput testOutput) 
    { 

    } 

    public void TestStarted(TestName testName) 
    { 

    } 

    public void UnhandledException(Exception exception) 
    { 

    } 
} 

public class Class1 
{ 
    [Test] 
    public void TestOnePlusOne() 
    { 
     Assert.AreEqual(1 + 1, 2); 
    } 

    [Test] 
    public void TestOnePlusTwo() 
    { 
     throw new Exception("Ooops"); 
    } 
} 

Et voici une page CSHTML pour aller avec elle. Nommez-le en tant que MyNUnit.cshtml:

@using NUnit.Core 
@{ 
    IList<TestResult> results = MyRunner.Run(typeof(Class1)); 
} 
<!DOCTYPE html> 
<html> 
<head> 
    <title></title> 
</head> 
<body> 
    <table> 
     @foreach (TestResult result in results) 
     { 
      <tr> 
       <td> 
        @result.Name 
       </td> 
       <td> 
        @result.IsSuccess 
       </td> 
       <td> 
        @result.Message 
       </td> 
      </tr> 
     } 
    </table> 
</body> 
</html> 
Questions connexes