mardi 27 janvier 2015

MVC Unit Test for Database with Moq - How to populate context data?

I am currently writing a unit test to test a "utility" method other methods will use to resolve relational database information (TopicID to TopicName). This information is referenced several places.


Here is what I do know:



  • I need to put matching data in the context to be returned upon a request call.

  • Try as I might I can't seem to do that. I get a type conversion error or an overload error.


So the big question - how can I get all the information into my mock database? I am using Moq 4, MVC5, and EF6.


The Controller's Utility Method mentioned above



//Use TopicID to look up Topic and Quiz Name - "Utility" method called in various places
//GET: TopicLookup/5
public async Task<Topics> TopicLookup(QuizHeader quizHeader)
{
int id = quizHeader.TopicID;
Task<Topics> getTopicTask = db.Topics.FindAsync(id);
//getTopicTask.Start();
Topics topics = await getTopicTask;

//Don't stop the user from completing the task, but do alert to some problems
ViewBag.TopicName = (topics.TopicName != null) ? "Unable to load topic name" : topics.TopicName;

return topics;
}


The Model involved



[Table("TopicList")]
public class Topics
{
[ForeignKey("LibraryID")]
[HiddenInput(DisplayValue = false)]
[Column("TopicID")]
public int TopicID { get; set; }

[Required(ErrorMessage = "Topic must be set!")]
[Display(Name = "Topic")]
[Column("TopicName")]
public string TopicName { get; set; }

[Display(Name = "Year")]
[Column("TopicYear")]
public int TopicYear { get; set; }
}


The unit test



[TestClass]
public class TopicLookupTest
{
[TestMethod]
public void ConvertToTopic()
{
//Arrange
var controller = new QuizHeaderController();
var header = new Models.QuizHeader();
var server = new Mock<HttpServerUtilityBase>();
var request = new Mock<HttpRequestBase>();
var context = new Mock<HttpContextBase>();

//DbSet<Topics> data;

var data = new Mock<Topics>();

//data.Add(new Topics { TopicID = 1, TopicName = "Test Topic", TopicYear = 2015 });

//data.TopicID = 1;
//data.TopicYear = 2015;
//data.TopicName = "Test Topic";

data.Setup(x => x.TopicID).Returns(1);
data.Setup(x => x.TopicName).Returns("Test Topic");
data.Setup(x => x.TopicYear).Returns(2015);

context.Setup(x => x.Server).Returns(server.Object);



controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);
header.TopicID = 1;

//Action
var result = controller.TopicLookup(header);


//Result
//Writing this later on

}
}

Aucun commentaire:

Enregistrer un commentaire