Sunday, July 24, 2016

MS Unit Testing with Mocking


MS Unit Testing with Mocking : Mock object which we unable to run and execute

Step : 1 Add 2 Class Library project "EmployeeLIB","NotificationLib" & UnitTestingproject

EmployeeLib:

namespace EmployeeLib
{
    public class Employee
    {
        public bool AddEmployee(SendMail.MyEmail mail)
        {
           
           return mail.SendMail();           
            /// Add database operation code

        }
    }
}

NotificationLib :
 
namespace NotificationLib
{
    public class MyEmails
    {
        public virtual bool SendMail()
        {
       
                MailMessage mail = new MailMessage();
                SmtpClient SmtpServer = new SmtpClient("smtp.krishna.com");

                mail.From = new MailAddress("your_email_address@krishna.com");
                mail.To.Add("to_address");
                mail.Subject = "Test Mail";
                mail.Body = "This is for testing SMTP mail from krishna domain";

                SmtpServer.Port = 587;
                SmtpServer.Credentials = new System.Net.NetworkCredential("username", "password");
                SmtpServer.EnableSsl = true;

                SmtpServer.Send(mail);
                return true;
          
        }
    }
}

Add unit test project and install Moq from nuget

namespace UnitTestEmployeeLib
{
    [TestClass]
    public class UnitTest1
    {
        [TestMethod]
        public void TestAddEmployee()
        {
            // object

            Mock<SendMail.MyEmails> obj = new Mock<SendMail.MyEmails>();

            // function need to moq

            obj.Setup(a => a.SendMail()).Returns(true);


            EmployeeLib.Employee objEmp = new EmployeeLib.Employee();

            bool result = objEmp.AddEmployee(obj.Object);

            Assert.AreEqual(result, true);
        }
    }
}


MS Unit Test Data Operation Using Entity Framework

MS Unit Test Data Operation Using Entity Framework

Step :1  - Add Entity

 public class Employee
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }

        public string Name { get; set; }
    }

Step 2: Add Context class

public class EmployeeDataContext : DbContext
    {
        public DbSet<Employee> Employee { get; set; }
    }

Step 3 : Enable-Migrations and Add Migration - Update Database

Step 4 : Create Class Library Project and add NUnit from Nuget

Step 5 : MS Unit Test Project

Add Reference EF from nuget and then add Testbase class

using System.Data.Entity.SqlServer;
using Microsoft.VisualStudio.TestTools.UnitTesting;

namespace UnitTestEmployeeOperations
{
    public abstract class TestBase
    {
        public void Init()
        {
            var instance = SqlProviderServices.Instance;
        }
    }
}

write a unit test for EF Add employee

namespace UnitTestEmployeeOperations
{
    [TestClass]
    public class UnitTest1
    {
        EmployeeOperation.EmployeeDataContext context;

        public TestContext TestContext { get; set; }

        [TestInitialize]
        public void TestSetup()
        {
            context = new EmployeeOperation.EmployeeDataContext();
           
        }

        //[TestMethod]
       // [DataSource("System.Data.SqlClient", "Data Source=(local);Initial Catalog=EmployeeDB;Integrated Security=True", "Employees", DataAccessMethod.Sequential)]
        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"E:\TrainingSamples\EmployeeOperation\UnitTestEmployeeOperations\testdata.csv", "testdata#csv", DataAccessMethod.Sequential), DeploymentItem("testdata.csv"), TestMethod]
        public void TestEmployeeInsert()
        {
            //context = new EmployeeOperation.EmployeeDataContext();
            int val = Convert.ToInt32(TestContext.DataRow["ID"]);
            string name = TestContext.DataRow["Name"].ToString();
            context.Employee.Add(new Employee { ID = val, Name = name });
            context.SaveChanges();

            Employee emp = context.Employee.Where(x => x.ID == val && x.Name == name).SingleOrDefault();

            Assert.AreEqual(val, emp.ID);
            Assert.AreEqual(name, emp.Name);

        }

        [TestCleanup]
        public void TestSetup1()
        {
            context = null;
        }
    }

Nunit Testing using Data Operation EF

Nunit Testing using Data Operation EF

Step :1  - Add Entity

 public class Employee
    {
        [Key]
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int ID { get; set; }

        public string Name { get; set; }
    }

Step 2: Add Context class

public class EmployeeDataContext : DbContext
    {
        public DbSet<Employee> Employee { get; set; }
    }

Step 3 : Enable-Migrations and Add Migration - Update Database

Step 4 : Create Class Library Project and add NUnit from Nuget

public class EmpOperationNunit
    {
        EmployeeOperation.EmployeeDataContext context;

        [OneTimeSetUp]  // TearUP
        public void Testmethod()
        {
            context = new EmployeeOperation.EmployeeDataContext();
        }

        [Test, TestCaseSource("TestCaseEmployeeinsert")]
        public void TestEmployedInsert(string Id, string name)
        {
            int val = Convert.ToInt32(Id);
            context.Employee.Add(new Employee { ID = val, Name = name });
            context.SaveChanges();

            var emp = context.Employee.Where(x => x.ID == val && x.Name == name).SingleOrDefault();

            Assert.AreEqual(emp.ID.ToString(), Id);
            Assert.AreEqual(emp.Name.ToString(), name);
        }

        public static IEnumerable TestCaseEmployeeinsert
        {
            get
            {
                ArrayList ar = new ArrayList();

                ar.Add(new TestCaseData("", ""));
                ar.Add(new TestCaseData("2", ""));
                ar.Add(new TestCaseData("", "krish"));
                ar.Add(new TestCaseData("1", "sadhaya"));

                foreach (var item in ar)
                {
                    yield return item;
                }
            }

        }


        [OneTimeTearDown] // Tear Down
        public void Testmethod1()
        {
            context = null;
        }
    }


Add Connection String : in Class Lib & Nunit App.config

 <connectionStrings>
    <add name="EmployeeDataContext" connectionString="Data Source=(local);Initial Catalog=EmployeeDB;Integrated Security=True" providerName="System.Data.SqlClient"/>
  </connectionStrings>


Saturday, July 23, 2016

MS Unit Testing DataDriven using Database


MS Unit Testing DataDriven using Database

[DataSource("System.Data.SqlClient", "Data Source=(local);Initial Catalog=Practise;Integrated Security=True", "TestData", DataAccessMethod.Sequential), TestMethod]
        public void TestWithDatabase()
        {
            int x = Convert.ToInt16(TestContext.DataRow["X"].ToString());
            int y = Convert.ToInt16(TestContext.DataRow["Y"].ToString());
            int expected = Convert.ToInt16(TestContext.DataRow["result"].ToString());

            CalculateMaths.MathClass obj = new CalculateMaths.MathClass();

            int actual = obj.Add(x, y);

            Assert.AreEqual(expected, actual);


        }

MS UNIT Test Data Driven with CSV file


 MS UNIT Test Data Driven with CSV file

[TestClass]
    public class UnitTestCalculateMath
    {
        public TestContext TestContext { get; set; }

        [DataSource("Microsoft.VisualStudio.TestTools.DataSource.CSV", @"E:\TrainingSamples\CalculateMaths\UnitTestCalculateMath\data.csv", "data#csv", DataAccessMethod.Sequential), DeploymentItem("data.csv"), TestMethod]
        public void TestExcel()
        {
            int x = Convert.ToInt16(TestContext.DataRow["Num1"].ToString());
            int y = Convert.ToInt16(TestContext.DataRow["Num2"].ToString());
            int expected = Convert.ToInt16(TestContext.DataRow["result"].ToString());

            CalculateMaths.MathClass obj = new CalculateMaths.MathClass();

            int actual = obj.Add(x, y);

            Assert.AreEqual(expected, actual);
        }
    }