-3

私のテスト ケースは常に失敗します。どこが間違っているか教えてください。コードは以下のとおりです

public class EmployeeService
{
    private readonly IRepository _repository;

    public EmployeeService(IRepository repository)
    {
        _repository = repository;
    }

    public bool SaveEmployeeData(Employee employee,bool isSaveNeeded)
    {
        bool result = false;
        try
        {
            if (isSaveNeeded)
            {
                result= _repository.Save(employee);
            }
        }
        catch (Exception ex)
        {
            throw new Exception();
        }
        return result;
    }
}

そして私のテストケースは

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    a.Setup(s => s.Save(new Employee())).Returns(true).Verifiable();
    var result = new EmployeeService(a.Object).SaveEmployeeData(new Employee(), true);
    Assert.IsTrue(result);
}

それは常に失敗します。

4

3 に答える 3

4

It.IsAny<Employee>保存方法パラメータの設定に使用

a.Setup(s => s.Save(It.IsAny<Employee>())).Returns(true).Verifiable();

テストが機能しない理由は、2 つの異なる従業員インスタンスがあるためです。1 つはモック セットアップ用で、もう 1 つはSaveEmployeeDataメソッド呼び出しに渡されます。デフォルトでは、これらのインスタンスは参照によって比較されます。MoqSaveは、参照 13 を持つ従業員インスタンスを使用したメソッド呼び出しを待機します (例)。しかし、リファレンス 42 を持つ別の従業員を渡しています。したがって、セットアップは呼び出されません。

さらに2つのオプションがあります

  • クラスのオーバーライドEqualsGetHashCodeメソッド。Employeeしたがって、Moq は参照ではなくビジネス データによって従業員を比較します。
  • モックセットアップとSaveEmployeeDataメソッド呼び出しの両方にまったく同じ従業員のインスタンスを使用します (望ましい方法)

同じ従業員インスタンスの使用法:

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    var sameEmployee = new Employee();
    a.Setup(s => s.Save(sameEmployee)).Returns(true).Verifiable();

    var service = new EmployeeService(a.Object);
    var result = service.SaveEmployeeData(sameEmployee, true);
    Assert.IsTrue(result);
}

同等性のオーバーライド:

public class Employee
{
    public override bool Equals(object obj)
    {
        Employee other = obj as Employee;
        if (other == null)
            return false;

        return this.Id == other.Id; // for example
    }
}

この場合、テストをそのままにしておくことができます。

于 2013-06-26T13:04:53.800 に答える
3

は、 のセットアップ用に 1 回、実際のnew Employee()のセットアップ用に 1 回、毎回新しい従業員インスタンスを作成しています。このため、提供された従業員はセットアップの要件と一致しません。SaveSaveEmployeeData

lazyberezovsky's answer のような包括的なアプローチを使用するか、次の手順を実行します。

[TestMethod()]
public void SaveEmployeeDataTest()
{
    var a = new Mock<IRepository>();
    var employee = new Employee();
    a.Setup(s => s.Save(employee)).Returns(true).Verifiable();
    var result = new EmployeeService(a.Object).SaveEmployeeData(employee, true);
    Assert.IsTrue(result);
}

実際の呼び出しと同じEmployeeインスタンスが設定で使用されるため、設定が一致し、正しい結果が返されます。

于 2013-06-26T13:05:49.123 に答える