Moq метод, имеющий вызов SQL c # - PullRequest
0 голосов
/ 11 июля 2019

Я пытаюсь Moq метод, который имеет вызов SQL, но не в состоянии сделать это:

Ниже приведен код Moq / Unit Test:

DataTable dataTable = new DataTable();
Mock<IDataAccessHelper> mockDataAccessHelper = new Mock<IDataAccessHelper>();
mockDataAccessHelper.Setup(x => x.ExtractDataFromDB(It.Is<string>(query => query.Contains("StudentTable")), It.IsAny<object[]>())).Returns(dataTable);

// This is the data access class from where I am calling the ExtractDataFromDB method which I want to Moq
IDataAccess dataAccess = new DataAccess();
object[] studentIds = new object[] {100,101,102};
List<Student> studentData= dataAccess.GetData(studentIds);

Ниже приведен код для модульного теста:

public class DataAccess : IDataAccess
{
    private IDataAccessHelper DataAccessHelper { get; set; }

    public DataAccess()
    {
        DataAccessHelper = new DataAccessHelper();   
    }

    public List<Student> GetData(object[] studentIds)
    {
       string query = "SELECT StudentName,Address,Marks FROM StudentTable WHERE StudentId = @StudentId"
       DataTable table = DataAccessHelper.ExtractDataFromDB(query,studentIds);
       List<Student> studentList = (from DataRow dr in dt.Rows  
       select new Student()  
       {  
            StudentName = dr["StudentName"].ToString(),  
            Address = dr["Address"].ToString(),  
            Marks= Convert.ToInt32(dr["Marks"])  
       }).ToList(); 
       return studentList;
    }
}

public interface IDataAccessHelper
{
   DataTable ExtractDataFromDB(string query,object[] values);
}

public class DataAccessHelper : IDataAccessHelper
{
    public DataTable ExtractDataFromDB(string query,object[] values)
    {
        foreach(var id in values)
        {  
           // SQL Call
        }
    }
}

Итак, я хочу протестировать метод GetData, чтобы проверить в StudentList список идентификаторов учеников, и внутри него я пытаюсь вызвать метод ExtractDataFromDB, имеющий вызов SQL.

Любая помощь ???

1 Ответ

2 голосов
/ 11 июля 2019

Чтобы достичь этого, вам нужно предоставить DataAccessHelper через внедрение зависимостей (например, конструктор-инъекцию) в ваш DataAccess -экземпляр. Не позволяйте вашему экземпляру создавать свои зависимости:

private IDataAccessHelper DataAccessHelper { get; }

public DataAccess(IDataAccessHelper helper)
{
    DataAccessHelper = helper;
}

Теперь вы можете предоставить любую реализацию этого интерфейса вашему экземпляру DataAccess:

IDataAccess dataAccess = new DataAccess(myMockForDataBaseHelper);
object[] studentIds = new object[] {100,101,102};
List<Student> studentData= dataAccess.GetData(studentIds);

В качестве альтернативы - поскольку у вас уже есть свойство для внедрения помощника - вы можете предоставить помощника после создания DataAccess -экземпляра. Это называется свойство-инъекция , в отличие от ранее упомянутого конструктор-инъекция . Однако вы должны сделать собственность public:

public IDataAccessHelper DataAccessHelper { get; set; }

public DataAccess()
{
    DataAccessHelper = new DataAccessHelper();   
}

А в вашем тесте:

IDataAccess dataAccess = new DataAccess();
dataAccess.DataAccessHelper = myMockForDataBaseHelper;
object[] studentIds = new object[] {100,101,102};
List<Student> studentData= dataAccess.GetData(studentIds);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...