Вопрос или проблема
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
.
В чем проблема?
Я использую:
- Visual Studio 2017
- .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
правильно собирается и не имеет ошибок. Если в нем есть проблемы, то приложение не сможет успешно ссылаться на него. Вы можете попробовать выполнить полную повторную сборку всех проектов.
- Убедитесь, что проект
unit_test_library
построен и скомпилирован без ошибок. - Убедитесь, что в проекте, где вы выполняете юнит-тесты, правильно установлена ссылка на
unit_test_library
. - Попробуйте удалить и заново добавить ссылку на
unit_test_library
.
4. Проверка версии сборки
Так как в использовании указана версия .NET Framework 4.7.2, убедитесь, что проект юнит-тестов также настроен на использование этой версии фреймворка. Разные версии фреймворка могут вести себя по-разному, и если ваши проекты используют разные версии, это может вызвать проблемы совместимости.
5. Компиляция и кэш
Иногда Visual Studio может кэшировать старые сборки, что также может привести к проблемам. Попробуйте:
- Очистить решение:
Build -> Clean Solution
. - Выполнить сборку решения:
Build -> Build Solution
. - Перезапустить Visual Studio.
Заключение
Проблема, с которой вы столкнулись, скорее всего, связана с неправильным использованием методов расширения или неверной настройкой проекта. Убедитесь, что вы правильно импортируете пространство имен, вызываете методы расширения корректно и проверяете правильность зависимостей проекта. После выполнения всех шагов, описанных выше, ваши расширяющие методы должны стать доступными для использования в ваших юнит-тестах.