1

MVC4 では、Ninject を使用してコントローラーを注入し、「インデックス」をテストしたいと考えています。書き込みのインジェクション(インジェクション用コントローラー):

public class NinjectDependencyResolver : IDependencyResolver
{ 
    private IKernel kernel;

    public NinjectDependencyResolver()
    {
        kernel = new StandardKernel();
        AddBindings();
    }

    private void AddBindings()
    { 
        kernel.Bind<IDB>().To<DB>();
    }

    public object GetService(Type serviceType)
    {
        return kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return kernel.GetAll(serviceType);
    } 
}

IDB:

public interface IDB
{
    IBugTrackRepository iBugTrackRepository { get; }
    ICategoryRepository iCategoryRepository { get; } 
    ...
    ...
    IUserRepository iUserRepository { get; }
}

達成するには:

public class DB : IDB
{    
    public IBugTrackRepository iBugTrackRepository
    {
        get { return new BugTrackRepository(); }
    }
    public ICategoryRepository iCategoryRepository
    {
        get { return new CategoryRepository(); }
    }
    ...
    ...
    public IUserRepository iUserRepository
    {
        get { return new UserRepository(); }
    }
}

達成するには:

public class BugTrackRepository : IBugTrackRepository
{
    private DBEntities context = new DBEntities ();

    public IQueryable<BugTrack> bugtrack
    {
        get { return context.BugTrack; }
    }
    ...
    //Other database operations...
}

コントローラー:

public class HomeController : Controller
{     
    private IDB repository; 
    public HomeController(IDB repo)
    {
        repository = repo;
    }

    public ActionResult Index()
    {
        ViewBag.mytitle = "Home Page";
        return View();
    }
}

テストコード:

    [TestMethod]
    public void TestIndex()
    {
        HomeController controller = new HomeController(??);

        ViewResult result = controller.Index() as ViewResult;

        Assert.AreEqual("Home Page", result.ViewBag.mytitle);
    }

しかし、このテストは間違っていて、このコントローラーをインスタンス化する方法がわかりません。助けてください!質問があれば、メッセージを残してください。

4

1 に答える 1

1

ホームのコンストラクターには IDB インターフェースが含まれているため、そこに渡す必要があります。

インターフェイスがあるので、モック オブジェクト ( https://stackoverflow.com/questions/37359/what-c ​​-sharp-mocking-framework-to-use ) を使用して IDB を模倣できます。

于 2013-03-15T09:09:20.913 に答える