2017-01-24 3 views
4

コントローラ内にあるメソッドをテストして模擬する必要があります。 NSubstituteフレームワークを使用してインターフェイスを実装することなく、コントローラ内でメソッドをモックすることは可能ですか?NSubstituteを使用してMVCコントローラメソッドをモックすることができます

ここは私のコントローラのページコードです。

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.Mvc; 

namespace Syncfusion.Cluster.Manager 
{ 
    public class HomeController : Controller 
    { 
     // GET: Home 
     public ActionResult Index() 
     { 
      int result = Sum(7, 7); 
      return View(); 
     } 

     public virtual int Sum(int a, int b) 
     { 
      return 0; 
     } 
    } 
} 

これは私のテストコードであり、Sumは常にデバッグ中にコントローラ内部で「0」であることがわかりました。コントローラー内のSum関数はオーバーライドされません。

using System; 
using NUnit.Framework; 
using Manager; 
using Base.Classes.Models.SecurityBase; 
using NSubstitute; 
using BaseProject; 
using System.Web.Mvc; 
using System.Web.Http; 

namespace NSubstituteControllerSupport 
{ 
    [TestFixture] 
    public class UnitTest1 
    { 
     [Test] 
     public void TestMethod1() 
     { 
      var controller = new HomeController();   
      //var actionMethod = Substitute.For<HomeController>(); 
      //actionMethod.Sum(Arg.Any<int>(), Arg.Any<int>()).Returns(14); 
      //var actual = controller.Index(); 

      var validation = Substitute.ForPartsOf<HomeController>(); 
      validation.When(x => x.Sum(a: Arg.Is(7), b: Arg.Is(7))).DoNotCallBase(); 
      validation.Sum(7, 7).Returns(14); 
      var actuals = controller.Index(); 

     } 
    } 
} 

ここは私のクラスライブラリプロジェクトのテストコードです。私はインターフェイスを実装せずにメソッドをうまく模擬しました。

[Test] 
public void TestMethod2() 
{ 
    #region variableDecleration 
    var adHost = new ActiveDirectoryHost(); 
    adHost.AdPath = @"C:\User\Security\1.0.0.0"; 
    adHost.CnNames = "CN=USERS"; 
    adHost.DomainName = "USER.COM"; 
    adHost.DomainPath = "DC=USER,DC=COM"; 
    adHost.Fqn = "HOSTNAME.USER.COM.USER.COM"; 
    adHost.HostName = "hostname.user.com"; 
    adHost.OuPath = "OU=NewSecur"; 
    adHost.SuperGroupName = "usergroup_1"; 
    adHost.IpAddress = "xxx.xx.xx.x"; 
    var adUserName = "username"; 
    var adPassword = "password"; 
    #endregion variableDecleration 

    var validation = Substitute.ForPartsOf<ValidationHandler>(); 
    validation.GetUserGroupList(userName: Arg.Is(adUserName), recursive: Arg.Is(false), adHost: Arg.Is(adHost), adUsername: Arg.Is(adUserName), adPassword: Arg.Is(adPassword)).Returns("usergroup_1,usergroup_2"); 
    var isUserInGroup = validation.IsUserMemberOfGroup(adUsername, "usergroup_1", adHost, adUserName, adPassword); 
    Assert.That(isUserInGroup, Is.EqualTo(true)); 
} 

答えて

2

仕事をする必要があり、次の

// arrange 
var controller = Substitute.For<HomeController>(); 
controller.Sum(7, 7).Returns(14); 

// act 
var actual = controller.Index(); 

// assert 
... 
+0

も@Darinディミトロフ私はすでにそれを試みたが、無駄 –

+2

に私はこのコードを実行しようとしましたし、それは完全に働きました。私は 'new HomeController()'を使って手動で 'HomeController'の新しいインスタンスを作成するのではなく、代わりにNS substituteに問い合わせてください:' var controller = Substitute.For (); '次に、あなたの 'Sum'メソッドが本当に**仮想**であると仮定し、値7と7を持つ2つのパラメータで呼び出すと14を返します。 –

+0

@Darin Dimitrovの欠陥を指摘してくれてありがとう。それは期待どおりに完璧に働いた –

関連する問題