Рефакторинг C# кода для создания метода, передающего разные объекты на основе модели, но для определенных типов c - PullRequest
0 голосов
/ 10 июля 2020

В настоящее время у меня есть много строк кода модульного теста, подобных этой

Assert.AreEqual(responseDetail1.ExternalICN, transaction1.Item2.ExternalICN);

По сути, есть много responseDetail1 и много responseDetail2 et c .. Поэтому я хочу вместо этого использовать метод

//call method passing in responseDetail1  or 2, 3  etc.. 
CheckResponseToTransactions(responseDetail1, transaction1);

Затем сам метод

public void CheckResponseToTransactions(ResponseDetail responseDetail, Transaction transaction)
{
    // notice this is generic model of ResponseDetail and thus this is NOT going to work
    Assert.AreEqual(responseDetail.ExternalICN, transaction.Item2.ExternalICN);
}

Как я могу исправить этот метод, чтобы он принимал многие определенные c объекты, которые имеют доступ к свойствам, которые мне нужно оценить?

Обновление - более полный пример

[TestMethod]
public void Can_Process_Response_With_Edits()
{
    var responseDetail1 = responseDetails.SingleOrDefault(d => d.TransmissionTransactionId == transaction1.Item1.TransmissionTransactionId);
    Assert.AreEqual(responseDetail1.ExternalICN, transaction1.Item2.ExternalICN);
    Assert.AreEqual(responseDetail1.EncounterId, transaction1.Item2.EncounterId);
}

Следующий метод тестирования

[TestMethod]
public void Can_Process_Response_Edits2()
{
    var responseDetail2 = responseDetails.SingleOrDefault(d => d.TransmissionTransactionId == transaction1.Item1.TransmissionTransactionId);
    Assert.AreEqual(responseDetail2.ExternalICN, transaction2.Item2.ExternalICN);
    Assert.AreEqual(responseDetail2.EncounterId, transaction2.Item2.EncounterId);
}

Таким образом, я хочу, чтобы несколько методов тестирования не выполняли одно и то же, и я хотел бы иметь метод I вызовите

// example of calling method 
CheckResponseToTransactions(responseDetail1, transaction1);

Затем сам метод, который я не знаю, как передать, и использовать определенные c типы

public void CheckResponseToTransactions(ResponseDetail responseDetail, Transaction transaction)
{
        Assert.AreEqual(responseDetail.ExternalICN, transaction.Item2.ExternalICN);CheckResponseToTransactions(responseDetail1, transaction1);            Assert.AreEqual(responseDetail1.EncounterId, transaction1.Item2.EncounterId);
        Assert.AreEqual(responseDetail1.VoucherNumber, transmission.BatchIdentifier);

        //Assert.AreEqual(responseDetail1.ExternalICN, transaction1.Item2.ExternalICN);
        //Assert.AreEqual(responseDetail1.EncounterId, transaction1.Item2.EncounterId);
        //Assert.AreEqual(responseDetail1.VoucherNumber, transmission.BatchIdentifier);
}

1 Ответ

1 голос
/ 11 июля 2020

Создайте свой метод с вашими спецификациями c типы объектов

например,

public void CheckResponseToTransactions(List<whateverResponse> responseDetail, List<whateverTransaction> transaction)
{           
     Assert.AreEqual(responseDetail.ExternalICN, transaction.Item2.ExternalICN);
     Assert.AreEqual(responseDetail.EncounterId, transaction.Item2.EncounterId);
}

ТЕПЕРЬ в вызывающей программе вы делаете это

[TestMethod]
public void Can_Process_Response_With_Edits()
{
    var responseDetail1 = responseDetails.SingleOrDefault(d => d.TransmissionTransactionId == transaction1.Item1.TransmissionTransactionId);

    CheckResponseToTransactions(responseDetail1, transaction1, transmission);
}

Другой из ваших тестов ...

[TestMethod]
public void Can_Process_Response_Edits2()
{
    var responseDetail2 = responseDetails.SingleOrDefault(d => d.TransmissionTransactionId == transaction2.Item1.TransmissionTransactionId);

    CheckResponseToTransactions(responseDetail2, transaction2, transmission);
}
...