Я понимаю, что вы не можете издеваться статическим методом с MOQ, но мне было интересно, что мои возможные вариантыMocking статических вариантов метода
У меня есть класс контроллера определен
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 (ложь), он пытается ударить базу данных.
Класс SelectList определяется как
public static class SelectLists
{
private static readonly ReferenceDataManager _dataManager = new ReferenceDataManager();
public static SelectList ContactClassifications(bool includeDeleted)
{
var data = _dataManager.GetContactClassifications();
}
}
и это линия, где она называет GetContactClassifications в SelectList, что он чувствует, что я должен быть в состоянии насмехаться (если метод, который вызывает это не может быть издевается, потому что он статичен). Это реализует интерфейс.
Даже если есть способ, которым можно было бы издеваться над личным методом в контроллере (InitialiseContactVM), это подойдет мне.
Есть ли способ достичь любой из этих вещей?
Приветствия Алехандро, спасибо за подробный ответ, я внес изменения, и он работает хорошо для меня – jazza1000