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));
}
も@Darinディミトロフ私はすでにそれを試みたが、無駄 –
に私はこのコードを実行しようとしましたし、それは完全に働きました。私は 'new HomeController()'を使って手動で 'HomeController'の新しいインスタンスを作成するのではなく、代わりにNS substituteに問い合わせてください:' var controller = Substitute.For(); '次に、あなたの 'Sum'メソッドが本当に**仮想**であると仮定し、値7と7を持つ2つのパラメータで呼び出すと14を返します。 –
@Darin Dimitrovの欠陥を指摘してくれてありがとう。それは期待どおりに完璧に働いた –