Проект модульных тестов не находит методы расширения.

Вопрос или проблема

using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace PdbLib
{
    public static class AssertExtensions
    {
        public static void AssertVec3Equal(this Assert assert, Vec3 expected, Vec3 actual, double tolerance, string message = "")
        {
            Assert.IsTrue(expected.DistanceTo(actual) <= tolerance, message);
        }

        public static void AssertVec3NotEqual(this Assert assert, Vec3 expected, Vec3 actual, double tolerance, string message = "")
        {
            Assert.IsTrue(expected.DistanceTo(actual) > tolerance, message);
        }

        public static void AssertVec3Equal2(this Assert assert, Vec3 expected, Vec3 actual, double tolerance, string message = "")
        {
            if (Math.Abs(expected.X - actual.X) >= tolerance)
            {
                throw new AssertFailedException($"{message} X-компонент неверен. Ожидалось: {expected.X}, Фактическое: {actual.X}");
            }

            if (Math.Abs(expected.Y - actual.Y) >= tolerance)
            {
                throw new AssertFailedException($"{message} Y-компонент неверен. Ожидалось: {expected.Y}, Фактическое: {actual.Y}");
            }

            if (Math.Abs(expected.Z - actual.Z) >= tolerance)
            {
                throw new AssertFailedException($"{message} Z-компонент неверен. Ожидалось: {expected.Z}, Фактическое: {actual.Z}");
            }
        }
    }
}

Я сохранил этот класс в проекте модульного тестирования и назвал его unit_test_library.

Затем я добавил библиотеку unit_test_library в качестве ссылки на фактические проекты модульного тестирования.

Тем не менее, эти проекты не находят эти функции как члены класса Assert.

В чем проблема?

Я использую:

  1. Visual Studio 2017
  2. .NET Framework 4.7.2

Пример использования:

using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using PdbLib; 

namespace PdbLibTests
{
    [TestClass]
    public class HingeMoversTests
    {
        [TestMethod]
        public void MakePredefinedMove()
        {
            MakePredefinedMoveN(1);
            //MakePredefinedHingeMoveN(7);
            //MakePredefinedHingeMoveN(8);
        }

        private void MakePredefinedMoveN(int hingeMoveSize)
        {
            int residue_count = 3;

            // Настройка генератора случайных чисел
            Random random = new Random(42);
            PdbLib.System model = PdbLib.System.MakeRandom(new int[] { residue_count }, 100.0, random);

            // Инициализация внутренних координат
            double[] r = new double[residue_count];
            double[] planar = new double[residue_count];
            double[] dihedral = new double[residue_count];
            Vec3[] coords = new Vec3[residue_count];

            for (int i = 0; i < residue_count; i++)
            {
                r[i] = 1.0;
                planar[i] = (90.0).ToRadian();
                dihedral[i] = (180.0).ToRadian();
                coords[i] = new Vec3();
            }

            NeRF.RestoreLinearChain(r, planar, dihedral, ref coords);//(0,0,0), (1,0,0), (1,1,0)

            for (int i = 0; i < residue_count; i++)
            {
                model.Vec3ToCa(i, coords[i]);//(0,0,0), (42949672, 0, 0), (42949672, 42949672, 0)
            }

            AtomMover mover = new AtomMover(hingeMoveSize, Math.PI / 2.0, Math.PI / 2.0);
            MoveProposal mp = new MoveProposal(hingeMoveSize);//(0,0,0)

            Vec3 v0Before = model.CaToVec3(0);//0,0,0
            Vec3 v1Before = model.CaToVec3(1);//1,0,0
            Vec3 lastBefore = model.CaToVec3(hingeMoveSize + 1);//1,1,0

            mover.ComputeMove(model, 1, Math.PI / 2, ref mp);//mp = (42949672, 0, -30370005)
            mp.Apply(ref model);//model = (0,0,0), (42949672, 0, -30370005), (42949672,42949672,0)

            Vec3 v0After = model.CaToVec3(0);//0,0,0
            Vec3 v1After = model.CaToVec3(1);//1,0,0
            Vec3 lastAfter = model.CaToVec3(hingeMoveSize + 1);//1,1,0

            Assert.AssertVec3Equal(v0Before, v0After, 1e-5, "Первый CA должен остаться неизменным.");
            Assert.AssertVec3Equal(lastBefore, lastAfter, 1e-5, "Последний CA должен остаться неизменным.");

            double dihedralMovedDegrees = Vec3Helper.DihedralAngle4(v1Before, v0Before, lastBefore, v1After).ToDegrees();

            Assert.AreEqual(90.0, Math.Abs(dihedralMovedDegrees), 0.01, "Диэдральный угол должен измениться на 90 градусов.");
        }        
    }
}

Ответ или решение

Проблема с тем, что ваш проект юнит-тестов не может найти расширяющие методы, может быть вызвана несколькими факторами. Давайте подробно рассмотрим возможные причины и решения данной ситуации.

1. Неправильное использование расширяющих методов

В вашем коде вы создаете статические методы расширения для класса Assert, но вызываете их с использованием ключевого слова Assert как если бы это были статические методы класса. Однако, чтобы использовать расширяющий метод, вы должны вызывать его на экземпляре класса, к которому он применяется.

Поскольку метод AssertVec3Equal объявлен как расширяющий метод для Assert, вы можете вызывать его через любой экземпляр, например:

AssertExtensions.AssertVec3Equal(expected, actual, tolerance, message);

Или вы можете создать экземпляр Assert, если это нужно, но это будет не совсем правильно, так как Assert – это статический класс. Правильный вызов будет выглядеть так:

AssertExtensions.AssertVec3Equal(v0Before, v0After, 1e-5, "Первый CA должен остаться неизменным.");

2. Отсутствие using директивы

Убедитесь, что вы добавили директиву using PdbLib; в файлы тестов, где вы планируете использовать расширяющие методы. Нарушение правила импорта пространства имен может привести к тому, что компилятор не найдет эти методы.

3. Сборка проекта и зависимостей

Проверьте, что проект unit_test_library правильно собирается и не имеет ошибок. Если в нем есть проблемы, то приложение не сможет успешно ссылаться на него. Вы можете попробовать выполнить полную повторную сборку всех проектов.

  1. Убедитесь, что проект unit_test_library построен и скомпилирован без ошибок.
  2. Убедитесь, что в проекте, где вы выполняете юнит-тесты, правильно установлена ссылка на unit_test_library.
  3. Попробуйте удалить и заново добавить ссылку на unit_test_library.

4. Проверка версии сборки

Так как в использовании указана версия .NET Framework 4.7.2, убедитесь, что проект юнит-тестов также настроен на использование этой версии фреймворка. Разные версии фреймворка могут вести себя по-разному, и если ваши проекты используют разные версии, это может вызвать проблемы совместимости.

5. Компиляция и кэш

Иногда Visual Studio может кэшировать старые сборки, что также может привести к проблемам. Попробуйте:

  • Очистить решение: Build -> Clean Solution.
  • Выполнить сборку решения: Build -> Build Solution.
  • Перезапустить Visual Studio.

Заключение

Проблема, с которой вы столкнулись, скорее всего, связана с неправильным использованием методов расширения или неверной настройкой проекта. Убедитесь, что вы правильно импортируете пространство имен, вызываете методы расширения корректно и проверяете правильность зависимостей проекта. После выполнения всех шагов, описанных выше, ваши расширяющие методы должны стать доступными для использования в ваших юнит-тестах.

Оцените материал
Добавить комментарий

Капча загружается...