0

moqで静的メソッドをモックできないことは理解していますが、可能なオプションは何だろうと思っていました

コントローラークラスを定義しました

public class CustomerController : BaseController
{
    private ICustomerManager cm;

    public CustomerController()
        : this(new CustomerManager())
    {
    }

    public CustomerController(ICustomerManager customerMan)
{
    cm = customerMan;
}

    public ActionResult EditContact(ContactVM model,  IEnumerable<HttpPostedFileBase> Files, PageAction pageAction)
    {
        if (ModelState.IsValid)
        {
            InitializeContactVM(model); //throws an error
        }
    }

    private void InitializeContactVM(ContactVM model)
    {
        model.Customer = cm.GetViewFindCustomerDetails((int)model.CustomerId);
        model.ContactClassificationList = AddBlankToList(SelectLists.ContactClassifications(false)); 
        model.ContactSourceList = AddBlankToList(SelectLists.ContactSources(false));
    }
}

そして、私の単体テストは次のようになります。

public void Edit_Contact_Update_Existing_Contact()
{
    var dataManager = new Mock<IReferenceDataManager>();
    //dataManager.Setup(a=>a.GetContactClassifications()).Returns()
    var contact = InitializeContact();
    var contactvm = new ContactVM(contact);
    var fileMock = new Mock<HttpPostedFileBase>();
    var files = new[] {fileMock.Object};

    var mocManager = InitializeMocManagerContact();
    mocManager.Setup(a => a.GetContactById(It.IsAny<int>())).Returns(contact);
    mocManager.Setup(a => a.UpdateContact(It.IsAny<ContactVM>(), It.IsAny<string>())).Returns(contact);

    var controller = new CustomerController(mocManager.Object);
    var controllerContext = InitializeContext();
    controller.ControllerContext = controllerContext.Object;
    //  mocManager.CallBase = true;

    var result = controller.EditContact(contactvm, files, PageAction.Default) as ViewResult;
    var model = result.ViewData.Model as ContactVM;

    Assert.IsTrue(model.ContactId == contact.CONTACT_ID);
}

問題は、SelectLists.ContactClassifications(false) を呼び出すプライベート メソッドにあり、データベースにアクセスしようとします。

SelectList クラスは次のように定義されます

public static class SelectLists
{
    private static readonly ReferenceDataManager _dataManager = new ReferenceDataManager();

    public static SelectList ContactClassifications(bool includeDeleted)
    {
        var data = _dataManager.GetContactClassifications();
    }
}

SelectList で GetContactClassifications を呼び出す行で、モックできるはずです (それを呼び出すメソッドが静的であるためモックできない場合)。これはインターフェイスを実装します。

コントローラー (InitialiseContactVM) のプライベート メソッドをモックできる方法があったとしても、それは私に合っています。

これらのことを達成する方法はありますか?

4

2 に答える 2

1

クラス自体をインスタンス化するのではなく、クラスSelectListsを注入できるようにクラスをリファクタリングする必要があります。IReferenceDataManager

于 2013-08-19T03:17:10.403 に答える